summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2014-07-24 10:27:55 -0700
committerKeith Packard <keithp@keithp.com>2014-09-12 13:51:14 -0700
commit616dea2c67847101fd43b5d89b556b3702c7f0bb (patch)
treebdcd3e4ec057deeab433f4958e2483cdb2c4074a
parent57c67199d043f3a653436769f1a69947a96d9d5b (diff)
Rename uxa-specific functions and structs
This starts to separate uxa from the rest of the driver by renaming uxa-specific functions and structs to make it clear which portions of the driver are uxa-specific and which are common. Signed-off-by: Keith Packard <keithp@keithp.com> Acked-by: Eric Anholt <eric@anholt.net>
-rw-r--r--src/uxa/Makefile.am4
-rw-r--r--src/uxa/i830_render.c82
-rw-r--r--src/uxa/i915_render.c100
-rw-r--r--src/uxa/i915_video.c10
-rw-r--r--src/uxa/i965_render.c98
-rw-r--r--src/uxa/i965_video.c48
-rw-r--r--src/uxa/intel.h266
-rw-r--r--src/uxa/intel_batchbuffer.c8
-rw-r--r--src/uxa/intel_batchbuffer.h4
-rw-r--r--src/uxa/intel_display.c78
-rw-r--r--src/uxa/intel_dri.c26
-rw-r--r--src/uxa/intel_dri3.c10
-rw-r--r--src/uxa/intel_driver.c39
-rw-r--r--src/uxa/intel_glamor.c4
-rw-r--r--src/uxa/intel_uxa.c134
-rw-r--r--src/uxa/intel_uxa.h299
-rw-r--r--src/uxa/intel_uxa_video.c389
-rw-r--r--src/uxa/intel_video.c1312
-rw-r--r--src/uxa/intel_video.h156
-rw-r--r--src/uxa/intel_video_overlay.c554
-rw-r--r--src/uxa/intel_video_overlay.h51
21 files changed, 2002 insertions, 1670 deletions
diff --git a/src/uxa/Makefile.am b/src/uxa/Makefile.am
index 0e10a2bb..23b074de 100644
--- a/src/uxa/Makefile.am
+++ b/src/uxa/Makefile.am
@@ -25,6 +25,7 @@ AM_CFLAGS += -I$(top_srcdir)/xvmc -I$(top_srcdir)/src -I$(top_srcdir)/src/render
noinst_LTLIBRARIES = libuxa.la
libuxa_la_LIBADD = $(UDEV_LIBS) $(DRMINTEL_LIBS) $(DRM_LIBS)
libuxa_la_SOURCES = \
+ intel_uxa.h \
brw_defines.h \
brw_structs.h \
common.h \
@@ -38,6 +39,9 @@ libuxa_la_SOURCES = \
intel_uxa.c \
intel_video.c \
intel_video.h \
+ intel_video_overlay.c \
+ intel_video_overlay.h \
+ intel_uxa_video.c \
i830_3d.c \
i830_render.c \
i830_reg.h \
diff --git a/src/uxa/i830_render.c b/src/uxa/i830_render.c
index ee68ec30..51374deb 100644
--- a/src/uxa/i830_render.c
+++ b/src/uxa/i830_render.c
@@ -166,7 +166,7 @@ static Bool i830_get_dest_format(PicturePtr dest_picture, uint32_t * dst_format)
break;
default:
scrn = xf86ScreenToScrn(dest_picture->pDrawable->pScreen);
- intel_debug_fallback(scrn, "Unsupported dest format 0x%x\n",
+ intel_uxa_debug_fallback(scrn, "Unsupported dest format 0x%x\n",
(int)dest_picture->format);
return FALSE;
}
@@ -197,7 +197,7 @@ static Bool i830_get_blend_cntl(ScrnInfoPtr scrn, int op, PicturePtr mask,
*/
if (dst_format == PICT_a8 && ((sblend == BLENDFACTOR_DST_ALPHA ||
sblend == BLENDFACTOR_INV_DST_ALPHA))) {
- intel_debug_fallback(scrn, "Can't do dst alpha blending with "
+ intel_uxa_debug_fallback(scrn, "Can't do dst alpha blending with "
"PICT_a8 dest.\n");
return FALSE;
}
@@ -257,7 +257,7 @@ static void i830_texture_setup(PicturePtr picture, PixmapPtr pixmap, int unit)
intel->scale_units[unit][1] = pixmap->drawable.height;
intel->transform[unit] = picture->transform;
- if (intel_transform_is_affine(intel->transform[unit]))
+ if (intel_uxa_transform_is_affine(intel->transform[unit]))
texcoordtype = TEXCOORDTYPE_CARTESIAN;
else
texcoordtype = TEXCOORDTYPE_HOMOGENEOUS;
@@ -293,9 +293,9 @@ static void i830_texture_setup(PicturePtr picture, PixmapPtr pixmap, int unit)
}
filter |= (MIPFILTER_NONE << TM0S3_MIP_FILTER_SHIFT);
- if (intel_pixmap_tiled(pixmap)) {
+ if (intel_uxa_pixmap_tiled(pixmap)) {
tiling_bits = TM0S1_TILED_SURFACE;
- if (intel_get_pixmap_private(pixmap)->tiling
+ if (intel_uxa_get_pixmap_private(pixmap)->tiling
== I915_TILING_Y)
tiling_bits |= TM0S1_TILE_WALK;
} else
@@ -352,7 +352,7 @@ i830_check_composite(int op,
/* Check for unsupported compositing operations. */
if (op >= sizeof(i830_blend_op) / sizeof(i830_blend_op[0])) {
- intel_debug_fallback(scrn, "Unsupported Composite op 0x%x\n",
+ intel_uxa_debug_fallback(scrn, "Unsupported Composite op 0x%x\n",
op);
return FALSE;
}
@@ -365,7 +365,7 @@ i830_check_composite(int op,
*/
if (i830_blend_op[op].src_alpha &&
(i830_blend_op[op].src_blend != BLENDFACTOR_ZERO)) {
- intel_debug_fallback(scrn, "Component alpha not "
+ intel_uxa_debug_fallback(scrn, "Component alpha not "
"supported with source alpha and "
"source value blending.\n");
return FALSE;
@@ -373,12 +373,12 @@ i830_check_composite(int op,
}
if (!i830_get_dest_format(dest_picture, &tmp1)) {
- intel_debug_fallback(scrn, "Get Color buffer format\n");
+ intel_uxa_debug_fallback(scrn, "Get Color buffer format\n");
return FALSE;
}
if (width > 2048 || height > 2048) {
- intel_debug_fallback(scrn, "Operation is too large (%d, %d)\n", width, height);
+ intel_uxa_debug_fallback(scrn, "Operation is too large (%d, %d)\n", width, height);
return FALSE;
}
@@ -391,7 +391,7 @@ i830_check_composite_target(PixmapPtr pixmap)
if (pixmap->drawable.width > 2048 || pixmap->drawable.height > 2048)
return FALSE;
- if(!intel_check_pitch_3d(pixmap))
+ if(!intel_uxa_check_pitch_3d(pixmap))
return FALSE;
return TRUE;
@@ -404,14 +404,14 @@ i830_check_composite_texture(ScreenPtr screen, PicturePtr picture)
intel_screen_private *intel = intel_get_screen_private(scrn);
if (picture->repeatType > RepeatReflect) {
- intel_debug_fallback(scrn, "Unsupported picture repeat %d\n",
+ intel_uxa_debug_fallback(scrn, "Unsupported picture repeat %d\n",
picture->repeatType);
return FALSE;
}
if (picture->filter != PictFilterNearest &&
picture->filter != PictFilterBilinear) {
- intel_debug_fallback(scrn, "Unsupported filter 0x%x\n",
+ intel_uxa_debug_fallback(scrn, "Unsupported filter 0x%x\n",
picture->filter);
return FALSE;
}
@@ -422,7 +422,7 @@ i830_check_composite_texture(ScreenPtr screen, PicturePtr picture)
w = picture->pDrawable->width;
h = picture->pDrawable->height;
if ((w > 2048) || (h > 2048)) {
- intel_debug_fallback(scrn,
+ intel_uxa_debug_fallback(scrn,
"Picture w/h too large (%dx%d)\n",
w, h);
return FALSE;
@@ -430,7 +430,7 @@ i830_check_composite_texture(ScreenPtr screen, PicturePtr picture)
/* XXX we can use the xrgb32 types if there the picture covers the clip */
if (!i8xx_get_card_format(intel, picture)) {
- intel_debug_fallback(scrn, "Unsupported picture format "
+ intel_uxa_debug_fallback(scrn, "Unsupported picture format "
"0x%x\n",
(int)picture->format);
return FALSE;
@@ -451,9 +451,9 @@ i830_prepare_composite(int op, PicturePtr source_picture,
intel_screen_private *intel = intel_get_screen_private(scrn);
drm_intel_bo *bo_table[] = {
NULL, /* batch_bo */
- intel_get_pixmap_bo(source),
- mask ? intel_get_pixmap_bo(mask) : NULL,
- intel_get_pixmap_bo(dest),
+ intel_uxa_get_pixmap_bo(source),
+ mask ? intel_uxa_get_pixmap_bo(mask) : NULL,
+ intel_uxa_get_pixmap_bo(dest),
};
intel->render_source_picture = source_picture;
@@ -463,7 +463,7 @@ i830_prepare_composite(int op, PicturePtr source_picture,
intel->render_dest_picture = dest_picture;
intel->render_dest = dest;
- if (!intel_check_pitch_3d(source))
+ if (!intel_uxa_check_pitch_3d(source))
return FALSE;
if (mask) {
if (mask_picture->componentAlpha &&
@@ -474,22 +474,22 @@ i830_prepare_composite(int op, PicturePtr source_picture,
*/
if (i830_blend_op[op].src_alpha &&
(i830_blend_op[op].src_blend != BLENDFACTOR_ZERO)) {
- intel_debug_fallback(scrn, "Component alpha not "
+ intel_uxa_debug_fallback(scrn, "Component alpha not "
"supported with source alpha and "
"source value blending.\n");
return FALSE;
}
}
- if (!intel_check_pitch_3d(mask))
+ if (!intel_uxa_check_pitch_3d(mask))
return FALSE;
}
- if (!intel_check_pitch_3d(dest))
+ if (!intel_uxa_check_pitch_3d(dest))
return FALSE;
if (!i830_get_dest_format(dest_picture, &intel->render_dest_format))
return FALSE;
- if (!intel_get_aperture_space(scrn, bo_table, ARRAY_SIZE(bo_table)))
+ if (!intel_uxa_get_aperture_space(scrn, bo_table, ARRAY_SIZE(bo_table)))
return FALSE;
if (mask) {
@@ -564,7 +564,7 @@ i830_prepare_composite(int op, PicturePtr source_picture,
intel->s8_blendctl = blendctl;
}
- if (intel_pixmap_is_dirty(source) || intel_pixmap_is_dirty(mask))
+ if (intel_uxa_pixmap_is_dirty(source) || intel_uxa_pixmap_is_dirty(mask))
intel_batch_emit_flush(scrn);
intel->needs_render_state_emit = TRUE;
@@ -585,9 +585,9 @@ static void i830_emit_composite_state(ScrnInfoPtr scrn)
assert(intel->in_batch_atomic);
- if (intel_pixmap_tiled(intel->render_dest)) {
+ if (intel_uxa_pixmap_tiled(intel->render_dest)) {
tiling_bits = BUF_3D_TILED_SURFACE;
- if (intel_get_pixmap_private(intel->render_dest)->tiling
+ if (intel_uxa_get_pixmap_private(intel->render_dest)->tiling
== I915_TILING_Y)
tiling_bits |= BUF_3D_TILE_WALK_Y;
} else
@@ -636,12 +636,12 @@ static void i830_emit_composite_state(ScrnInfoPtr scrn)
DISABLE_STENCIL_WRITE | ENABLE_TEX_CACHE |
DISABLE_DITHER | ENABLE_COLOR_WRITE | DISABLE_DEPTH_WRITE);
- if (intel_transform_is_affine(intel->render_source_picture->transform))
+ if (intel_uxa_transform_is_affine(intel->render_source_picture->transform))
texcoordfmt |= (TEXCOORDFMT_2D << 0);
else
texcoordfmt |= (TEXCOORDFMT_3D << 0);
if (intel->render_mask) {
- if (intel_transform_is_affine
+ if (intel_uxa_transform_is_affine
(intel->render_mask_picture->transform))
texcoordfmt |= (TEXCOORDFMT_2D << 2);
else
@@ -677,23 +677,23 @@ i830_emit_composite_primitive(PixmapPtr dest,
{
float x = srcX, y = srcY;
- is_affine_src = intel_transform_is_affine(intel->transform[0]);
+ is_affine_src = intel_uxa_transform_is_affine(intel->transform[0]);
if (is_affine_src) {
- if (!intel_get_transformed_coordinates(x, y,
+ if (!intel_uxa_get_transformed_coordinates(x, y,
intel->
transform[0],
&src_x[0],
&src_y[0]))
return;
- if (!intel_get_transformed_coordinates(x, y + h,
+ if (!intel_uxa_get_transformed_coordinates(x, y + h,
intel->
transform[0],
&src_x[1],
&src_y[1]))
return;
- if (!intel_get_transformed_coordinates(x + w, y + h,
+ if (!intel_uxa_get_transformed_coordinates(x + w, y + h,
intel->
transform[0],
&src_x[2],
@@ -702,7 +702,7 @@ i830_emit_composite_primitive(PixmapPtr dest,
per_vertex += 2; /* src x/y */
} else {
- if (!intel_get_transformed_coordinates_3d(x, y,
+ if (!intel_uxa_get_transformed_coordinates_3d(x, y,
intel->
transform[0],
&src_x[0],
@@ -710,7 +710,7 @@ i830_emit_composite_primitive(PixmapPtr dest,
&src_w[0]))
return;
- if (!intel_get_transformed_coordinates_3d(x, y + h,
+ if (!intel_uxa_get_transformed_coordinates_3d(x, y + h,
intel->
transform[0],
&src_x[1],
@@ -718,7 +718,7 @@ i830_emit_composite_primitive(PixmapPtr dest,
&src_w[1]))
return;
- if (!intel_get_transformed_coordinates_3d(x + w, y + h,
+ if (!intel_uxa_get_transformed_coordinates_3d(x + w, y + h,
intel->
transform[0],
&src_x[2],
@@ -733,23 +733,23 @@ i830_emit_composite_primitive(PixmapPtr dest,
if (intel->render_mask) {
float x = maskX, y = maskY;
- is_affine_mask = intel_transform_is_affine(intel->transform[1]);
+ is_affine_mask = intel_uxa_transform_is_affine(intel->transform[1]);
if (is_affine_mask) {
- if (!intel_get_transformed_coordinates(x, y,
+ if (!intel_uxa_get_transformed_coordinates(x, y,
intel->
transform[1],
&mask_x[0],
&mask_y[0]))
return;
- if (!intel_get_transformed_coordinates(x, y + h,
+ if (!intel_uxa_get_transformed_coordinates(x, y + h,
intel->
transform[1],
&mask_x[1],
&mask_y[1]))
return;
- if (!intel_get_transformed_coordinates(x + w, y + h,
+ if (!intel_uxa_get_transformed_coordinates(x + w, y + h,
intel->
transform[1],
&mask_x[2],
@@ -758,7 +758,7 @@ i830_emit_composite_primitive(PixmapPtr dest,
per_vertex += 2; /* mask x/y */
} else {
- if (!intel_get_transformed_coordinates_3d(x, y,
+ if (!intel_uxa_get_transformed_coordinates_3d(x, y,
intel->
transform[1],
&mask_x[0],
@@ -766,7 +766,7 @@ i830_emit_composite_primitive(PixmapPtr dest,
&mask_w[0]))
return;
- if (!intel_get_transformed_coordinates_3d(x, y + h,
+ if (!intel_uxa_get_transformed_coordinates_3d(x, y + h,
intel->
transform[1],
&mask_x[1],
@@ -774,7 +774,7 @@ i830_emit_composite_primitive(PixmapPtr dest,
&mask_w[1]))
return;
- if (!intel_get_transformed_coordinates_3d(x + w, y + h,
+ if (!intel_uxa_get_transformed_coordinates_3d(x + w, y + h,
intel->
transform[1],
&mask_x[2],
diff --git a/src/uxa/i915_render.c b/src/uxa/i915_render.c
index 577abac2..5238d8f5 100644
--- a/src/uxa/i915_render.c
+++ b/src/uxa/i915_render.c
@@ -174,7 +174,7 @@ static Bool i915_get_dest_format(PicturePtr dest_picture, uint32_t * dst_format)
break;
default:
scrn = xf86ScreenToScrn(dest_picture->pDrawable->pScreen);
- intel_debug_fallback(scrn,
+ intel_uxa_debug_fallback(scrn,
"Unsupported dest format 0x%x\n",
(int)dest_picture->format);
return FALSE;
@@ -195,7 +195,7 @@ i915_check_composite(int op,
/* Check for unsupported compositing operations. */
if (op >= sizeof(i915_blend_op) / sizeof(i915_blend_op[0])) {
- intel_debug_fallback(scrn, "Unsupported Composite op 0x%x\n",
+ intel_uxa_debug_fallback(scrn, "Unsupported Composite op 0x%x\n",
op);
return FALSE;
}
@@ -208,7 +208,7 @@ i915_check_composite(int op,
if (i915_blend_op[op].src_alpha &&
(i915_blend_op[op].src_blend != BLENDFACT_ZERO)) {
if (op != PictOpOver) {
- intel_debug_fallback(scrn,
+ intel_uxa_debug_fallback(scrn,
"Component alpha not supported "
"with source alpha and source "
"value blending.\n");
@@ -218,7 +218,7 @@ i915_check_composite(int op,
}
if (!i915_get_dest_format(dest_picture, &tmp1)) {
- intel_debug_fallback(scrn, "Get Color buffer format\n");
+ intel_uxa_debug_fallback(scrn, "Get Color buffer format\n");
return FALSE;
}
@@ -234,7 +234,7 @@ i915_check_composite_target(PixmapPtr pixmap)
if (pixmap->drawable.width > 2048 || pixmap->drawable.height > 2048)
return FALSE;
- if(!intel_check_pitch_3d(pixmap))
+ if(!intel_uxa_check_pitch_3d(pixmap))
return FALSE;
return TRUE;
@@ -245,7 +245,7 @@ i915_check_composite_texture(ScreenPtr screen, PicturePtr picture)
{
if (picture->repeatType > RepeatReflect) {
ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
- intel_debug_fallback(scrn, "Unsupported picture repeat %d\n",
+ intel_uxa_debug_fallback(scrn, "Unsupported picture repeat %d\n",
picture->repeatType);
return FALSE;
}
@@ -253,7 +253,7 @@ i915_check_composite_texture(ScreenPtr screen, PicturePtr picture)
if (picture->filter != PictFilterNearest &&
picture->filter != PictFilterBilinear) {
ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
- intel_debug_fallback(scrn, "Unsupported filter 0x%x\n",
+ intel_uxa_debug_fallback(scrn, "Unsupported filter 0x%x\n",
picture->filter);
return FALSE;
}
@@ -268,7 +268,7 @@ i915_check_composite_texture(ScreenPtr screen, PicturePtr picture)
h = picture->pDrawable->height;
if ((w > 2048) || (h > 2048)) {
ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
- intel_debug_fallback(scrn,
+ intel_uxa_debug_fallback(scrn,
"Picture w/h too large (%dx%d)\n",
w, h);
return FALSE;
@@ -283,7 +283,7 @@ i915_check_composite_texture(ScreenPtr screen, PicturePtr picture)
if (i == sizeof(i915_tex_formats) / sizeof(i915_tex_formats[0]))
{
ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
- intel_debug_fallback(scrn, "Unsupported picture format "
+ intel_uxa_debug_fallback(scrn, "Unsupported picture format "
"0x%x\n",
(int)picture->format);
return FALSE;
@@ -313,7 +313,7 @@ static Bool i915_texture_setup(PicturePtr picture, PixmapPtr pixmap, int unit)
break;
}
if (i == sizeof(i915_tex_formats) / sizeof(i915_tex_formats[0])) {
- intel_debug_fallback(scrn, "unknown texture format\n");
+ intel_uxa_debug_fallback(scrn, "unknown texture format\n");
return FALSE;
}
format = i915_tex_formats[i].card_fmt;
@@ -345,15 +345,15 @@ static Bool i915_texture_setup(PicturePtr picture, PixmapPtr pixmap, int unit)
(FILTER_LINEAR << SS2_MIN_FILTER_SHIFT);
break;
default:
- intel_debug_fallback(scrn, "Bad filter 0x%x\n",
+ intel_uxa_debug_fallback(scrn, "Bad filter 0x%x\n",
picture->filter);
return FALSE;
}
/* offset filled in at emit time */
- if (intel_pixmap_tiled(pixmap)) {
+ if (intel_uxa_pixmap_tiled(pixmap)) {
tiling_bits = MS3_TILED_SURFACE;
- if (intel_get_pixmap_private(pixmap)->tiling
+ if (intel_uxa_get_pixmap_private(pixmap)->tiling
== I915_TILING_Y)
tiling_bits |= MS3_TILE_WALK;
} else
@@ -415,19 +415,19 @@ i915_emit_composite_primitive_affine_source(intel_screen_private *intel,
{
float src_x[3], src_y[3];
- if (!intel_get_transformed_coordinates(srcX, srcY,
+ if (!intel_uxa_get_transformed_coordinates(srcX, srcY,
intel->transform[0],
&src_x[0],
&src_y[0]))
return;
- if (!intel_get_transformed_coordinates(srcX, srcY + h,
+ if (!intel_uxa_get_transformed_coordinates(srcX, srcY + h,
intel->transform[0],
&src_x[1],
&src_y[1]))
return;
- if (!intel_get_transformed_coordinates(srcX + w, srcY + h,
+ if (!intel_uxa_get_transformed_coordinates(srcX + w, srcY + h,
intel->transform[0],
&src_x[2],
&src_y[2]))
@@ -492,30 +492,30 @@ i915_emit_composite_primitive(intel_screen_private *intel,
src_unit = tex_unit++;
- is_affine_src = intel_transform_is_affine(intel->transform[src_unit]);
+ is_affine_src = intel_uxa_transform_is_affine(intel->transform[src_unit]);
if (is_affine_src) {
- if (!intel_get_transformed_coordinates(srcX, srcY,
+ if (!intel_uxa_get_transformed_coordinates(srcX, srcY,
intel->
transform[src_unit],
&src_x[0],
&src_y[0]))
return;
- if (!intel_get_transformed_coordinates(srcX, srcY + h,
+ if (!intel_uxa_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,
+ if (!intel_uxa_get_transformed_coordinates(srcX + w, srcY + h,
intel->
transform[src_unit],
&src_x[2],
&src_y[2]))
return;
} else {
- if (!intel_get_transformed_coordinates_3d(srcX, srcY,
+ if (!intel_uxa_get_transformed_coordinates_3d(srcX, srcY,
intel->
transform[src_unit],
&src_x[0],
@@ -523,7 +523,7 @@ i915_emit_composite_primitive(intel_screen_private *intel,
&src_w[0]))
return;
- if (!intel_get_transformed_coordinates_3d(srcX, srcY + h,
+ if (!intel_uxa_get_transformed_coordinates_3d(srcX, srcY + h,
intel->
transform[src_unit],
&src_x[1],
@@ -531,7 +531,7 @@ i915_emit_composite_primitive(intel_screen_private *intel,
&src_w[1]))
return;
- if (!intel_get_transformed_coordinates_3d(srcX + w, srcY + h,
+ if (!intel_uxa_get_transformed_coordinates_3d(srcX + w, srcY + h,
intel->
transform[src_unit],
&src_x[2],
@@ -543,30 +543,30 @@ i915_emit_composite_primitive(intel_screen_private *intel,
if (intel->render_mask) {
mask_unit = tex_unit++;
- is_affine_mask = intel_transform_is_affine(intel->transform[mask_unit]);
+ is_affine_mask = intel_uxa_transform_is_affine(intel->transform[mask_unit]);
if (is_affine_mask) {
- if (!intel_get_transformed_coordinates(maskX, maskY,
+ if (!intel_uxa_get_transformed_coordinates(maskX, maskY,
intel->
transform[mask_unit],
&mask_x[0],
&mask_y[0]))
return;
- if (!intel_get_transformed_coordinates(maskX, maskY + h,
+ if (!intel_uxa_get_transformed_coordinates(maskX, maskY + h,
intel->
transform[mask_unit],
&mask_x[1],
&mask_y[1]))
return;
- if (!intel_get_transformed_coordinates(maskX + w, maskY + h,
+ if (!intel_uxa_get_transformed_coordinates(maskX + w, maskY + h,
intel->
transform[mask_unit],
&mask_x[2],
&mask_y[2]))
return;
} else {
- if (!intel_get_transformed_coordinates_3d(maskX, maskY,
+ if (!intel_uxa_get_transformed_coordinates_3d(maskX, maskY,
intel->
transform[mask_unit],
&mask_x[0],
@@ -574,7 +574,7 @@ i915_emit_composite_primitive(intel_screen_private *intel,
&mask_w[0]))
return;
- if (!intel_get_transformed_coordinates_3d(maskX, maskY + h,
+ if (!intel_uxa_get_transformed_coordinates_3d(maskX, maskY + h,
intel->
transform[mask_unit],
&mask_x[1],
@@ -582,7 +582,7 @@ i915_emit_composite_primitive(intel_screen_private *intel,
&mask_w[1]))
return;
- if (!intel_get_transformed_coordinates_3d(maskX + w, maskY + h,
+ if (!intel_uxa_get_transformed_coordinates_3d(maskX + w, maskY + h,
intel->
transform[mask_unit],
&mask_x[2],
@@ -653,9 +653,9 @@ i915_prepare_composite(int op, PicturePtr source_picture,
intel_screen_private *intel = intel_get_screen_private(scrn);
drm_intel_bo *bo_table[] = {
NULL, /* batch_bo */
- intel_get_pixmap_bo(dest),
- intel_get_pixmap_bo(source),
- mask ? intel_get_pixmap_bo(mask) : NULL,
+ intel_uxa_get_pixmap_bo(dest),
+ intel_uxa_get_pixmap_bo(source),
+ mask ? intel_uxa_get_pixmap_bo(mask) : NULL,
};
int tex_unit = 0;
int floats_per_vertex;
@@ -667,20 +667,20 @@ i915_prepare_composite(int op, PicturePtr source_picture,
intel->render_dest_picture = dest_picture;
intel->render_dest = dest;
- if (!intel_check_pitch_3d(source))
+ if (!intel_uxa_check_pitch_3d(source))
return FALSE;
- if (mask && !intel_check_pitch_3d(mask))
+ if (mask && !intel_uxa_check_pitch_3d(mask))
return FALSE;
- if (!intel_check_pitch_3d(dest))
+ if (!intel_uxa_check_pitch_3d(dest))
return FALSE;
if (!i915_get_dest_format(dest_picture,
&intel->i915_render_state.dst_format))
return FALSE;
- if (!intel_get_aperture_space(scrn, bo_table, ARRAY_SIZE(bo_table)))
+ if (!intel_uxa_get_aperture_space(scrn, bo_table, ARRAY_SIZE(bo_table)))
return FALSE;
if (mask_picture != NULL && mask_picture->componentAlpha &&
@@ -703,11 +703,11 @@ i915_prepare_composite(int op, PicturePtr source_picture,
floats_per_vertex = 2; /* dest x/y */
if (!i915_texture_setup(source_picture, source, tex_unit++)) {
- intel_debug_fallback(scrn, "fail to setup src texture\n");
+ intel_uxa_debug_fallback(scrn, "fail to setup src texture\n");
return FALSE;
}
- if (intel_transform_is_affine(source_picture->transform))
+ if (intel_uxa_transform_is_affine(source_picture->transform))
floats_per_vertex += 2; /* src x/y */
else
floats_per_vertex += 4; /* src x/y/z/w */
@@ -715,12 +715,12 @@ i915_prepare_composite(int op, PicturePtr source_picture,
if (mask_picture != NULL) {
assert(mask != NULL);
if (!i915_texture_setup(mask_picture, mask, tex_unit++)) {
- intel_debug_fallback(scrn,
+ intel_uxa_debug_fallback(scrn,
"fail to setup mask texture\n");
return FALSE;
}
- if (intel_transform_is_affine(mask_picture->transform))
+ if (intel_uxa_transform_is_affine(mask_picture->transform))
floats_per_vertex += 2; /* mask x/y */
else
floats_per_vertex += 4; /* mask x/y/z/w */
@@ -728,7 +728,7 @@ i915_prepare_composite(int op, PicturePtr source_picture,
intel->i915_render_state.op = op;
- if (intel_pixmap_is_dirty(source) || intel_pixmap_is_dirty(mask))
+ if (intel_uxa_pixmap_is_dirty(source) || intel_uxa_pixmap_is_dirty(mask))
intel_batch_emit_flush(scrn);
intel->needs_render_state_emit = TRUE;
@@ -737,7 +737,7 @@ i915_prepare_composite(int op, PicturePtr source_picture,
if (!mask) {
if (intel->transform[0] == NULL)
intel->prim_emit = i915_emit_composite_primitive_identity_source;
- else if (intel_transform_is_affine(intel->transform[0]))
+ else if (intel_uxa_transform_is_affine(intel->transform[0]))
intel->prim_emit = i915_emit_composite_primitive_affine_source;
} else {
if (intel->transform[0] == NULL) {
@@ -775,7 +775,7 @@ i915_composite_emit_shader(intel_screen_private *intel, CARD8 op)
else
src_reg = FS_OC;
- if (intel_transform_is_affine(intel->transform[0]))
+ if (intel_uxa_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);
@@ -787,7 +787,7 @@ i915_composite_emit_shader(intel_screen_private *intel, CARD8 op)
i915_fs_dcl(FS_S1);
/* Load the source_picture texel */
- if (intel_transform_is_affine(intel->transform[0]))
+ if (intel_uxa_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);
@@ -795,7 +795,7 @@ i915_composite_emit_shader(intel_screen_private *intel, CARD8 op)
src_reg = FS_R0;
/* Load the mask_picture texel */
- if (intel_transform_is_affine(intel->transform[1]))
+ if (intel_uxa_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);
@@ -883,9 +883,9 @@ static void i915_emit_composite_setup(ScrnInfoPtr scrn)
if (1) {
uint32_t tiling_bits;
- if (intel_pixmap_tiled(dest)) {
+ if (intel_uxa_pixmap_tiled(dest)) {
tiling_bits = BUF_3D_TILED_SURFACE;
- if (intel_get_pixmap_private(dest)->tiling
+ if (intel_uxa_get_pixmap_private(dest)->tiling
== I915_TILING_Y)
tiling_bits |= BUF_3D_TILE_WALK_Y;
} else
@@ -916,12 +916,12 @@ static void i915_emit_composite_setup(ScrnInfoPtr scrn)
ss2 = ~0;
ss2 &= ~S2_TEXCOORD_FMT(0, TEXCOORDFMT_NOT_PRESENT);
ss2 |= S2_TEXCOORD_FMT(0,
- intel_transform_is_affine(intel->transform[0]) ?
+ intel_uxa_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]) ?
+ intel_uxa_transform_is_affine(intel->transform[1]) ?
TEXCOORDFMT_2D : TEXCOORDFMT_4D);
}
diff --git a/src/uxa/i915_video.c b/src/uxa/i915_video.c
index 16389cdb..1996e8ce 100644
--- a/src/uxa/i915_video.c
+++ b/src/uxa/i915_video.c
@@ -67,7 +67,7 @@ I915DisplayVideoTextured(ScrnInfoPtr scrn,
dyo = dstRegion->extents.y1;
if (pixmap->drawable.width > 2048 || pixmap->drawable.height > 2048 ||
- !intel_check_pitch_3d(pixmap)) {
+ !intel_uxa_check_pitch_3d(pixmap)) {
ScreenPtr screen = pixmap->drawable.pScreen;
target = screen->CreatePixmap(screen,
@@ -78,7 +78,7 @@ I915DisplayVideoTextured(ScrnInfoPtr scrn,
if (target == NULL)
return;
- if (intel_get_pixmap_bo(target) == NULL) {
+ if (intel_uxa_get_pixmap_bo(target) == NULL) {
screen->DestroyPixmap(target);
return;
}
@@ -159,9 +159,9 @@ I915DisplayVideoTextured(ScrnInfoPtr scrn,
DSTORG_VERT_BIAS(0x8) | format);
/* front buffer, pitch, offset */
- if (intel_pixmap_tiled(target)) {
+ if (intel_uxa_pixmap_tiled(target)) {
tiling = BUF_3D_TILED_SURFACE;
- if (intel_get_pixmap_private(target)->tiling == I915_TILING_Y)
+ if (intel_uxa_get_pixmap_private(target)->tiling == I915_TILING_Y)
tiling |= BUF_3D_TILE_WALK_Y;
} else
tiling = 0;
@@ -488,5 +488,5 @@ I915DisplayVideoTextured(ScrnInfoPtr scrn,
target->drawable.pScreen->DestroyPixmap(target);
}
- intel_debug_flush(scrn);
+ intel_uxa_debug_flush(scrn);
}
diff --git a/src/uxa/i965_render.c b/src/uxa/i965_render.c
index 74f57afc..205744d7 100644
--- a/src/uxa/i965_render.c
+++ b/src/uxa/i965_render.c
@@ -186,7 +186,7 @@ i965_check_composite(int op,
/* Check for unsupported compositing operations. */
if (op >= sizeof(i965_blend_op) / sizeof(i965_blend_op[0])) {
- intel_debug_fallback(scrn,
+ intel_uxa_debug_fallback(scrn,
"Unsupported Composite op 0x%x\n", op);
return FALSE;
}
@@ -199,7 +199,7 @@ i965_check_composite(int op,
*/
if (i965_blend_op[op].src_alpha &&
(i965_blend_op[op].src_blend != BRW_BLENDFACTOR_ZERO)) {
- intel_debug_fallback(scrn,
+ intel_uxa_debug_fallback(scrn,
"Component alpha not supported "
"with source alpha and source "
"value blending.\n");
@@ -208,7 +208,7 @@ i965_check_composite(int op,
}
if (i965_get_dest_format(dest_picture) == -1) {
- intel_debug_fallback(scrn, "Usupported Color buffer format 0x%x\n",
+ intel_uxa_debug_fallback(scrn, "Usupported Color buffer format 0x%x\n",
(int)dest_picture->format);
return FALSE;
}
@@ -221,7 +221,7 @@ i965_check_composite_texture(ScreenPtr screen, PicturePtr picture)
{
if (picture->repeatType > RepeatReflect) {
ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
- intel_debug_fallback(scrn,
+ intel_uxa_debug_fallback(scrn,
"extended repeat (%d) not supported\n",
picture->repeatType);
return FALSE;
@@ -230,7 +230,7 @@ i965_check_composite_texture(ScreenPtr screen, PicturePtr picture)
if (picture->filter != PictFilterNearest &&
picture->filter != PictFilterBilinear) {
ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
- intel_debug_fallback(scrn, "Unsupported filter 0x%x\n",
+ intel_uxa_debug_fallback(scrn, "Unsupported filter 0x%x\n",
picture->filter);
return FALSE;
}
@@ -242,7 +242,7 @@ i965_check_composite_texture(ScreenPtr screen, PicturePtr picture)
h = picture->pDrawable->height;
if ((w > 8192) || (h > 8192)) {
ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
- intel_debug_fallback(scrn,
+ intel_uxa_debug_fallback(scrn,
"Picture w/h too large (%dx%d)\n",
w, h);
return FALSE;
@@ -257,7 +257,7 @@ i965_check_composite_texture(ScreenPtr screen, PicturePtr picture)
if (i == sizeof(i965_tex_formats) / sizeof(i965_tex_formats[0]))
{
ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
- intel_debug_fallback(scrn,
+ intel_uxa_debug_fallback(scrn,
"Unsupported picture format "
"0x%x\n",
(int)picture->format);
@@ -791,7 +791,7 @@ static drm_intel_bo *gen4_create_sf_state(intel_screen_private *intel,
sf_state = memset(sf_state_bo->virtual, 0, sizeof(*sf_state));
sf_state->thread0.grf_reg_count = BRW_GRF_BLOCKS(SF_KERNEL_NUM_GRF);
sf_state->thread0.kernel_start_pointer =
- intel_emit_reloc(sf_state_bo,
+ intel_uxa_emit_reloc(sf_state_bo,
offsetof(struct brw_sf_unit_state, thread0),
kernel_bo, sf_state->thread0.grf_reg_count << 1,
I915_GEM_DOMAIN_INSTRUCTION, 0) >> 6;
@@ -838,7 +838,7 @@ static drm_intel_bo *sampler_border_color_create(intel_screen_private *intel)
sampler_border_color.color[2] = 0; /* B */
sampler_border_color.color[3] = 0; /* A */
- return intel_bo_alloc_for_data(intel,
+ return intel_uxa_bo_alloc_for_data(intel,
&sampler_border_color,
sizeof(sampler_border_color),
"gen4 render sampler border color");
@@ -902,7 +902,7 @@ gen4_sampler_state_init(drm_intel_bo * sampler_state_bo,
}
sampler_state->ss2.border_color_pointer =
- intel_emit_reloc(sampler_state_bo, sampler_state_offset +
+ intel_uxa_emit_reloc(sampler_state_bo, sampler_state_offset +
offsetof(struct brw_sampler_state, ss2),
border_color_bo, 0,
I915_GEM_DOMAIN_SAMPLER, 0) >> 5;
@@ -968,7 +968,7 @@ gen7_sampler_state_init(drm_intel_bo * sampler_state_bo,
}
sampler_state->ss2.default_color_pointer =
- intel_emit_reloc(sampler_state_bo, sampler_state_offset +
+ intel_uxa_emit_reloc(sampler_state_bo, sampler_state_offset +
offsetof(struct gen7_sampler_state, ss2),
border_color_bo, 0,
I915_GEM_DOMAIN_SAMPLER, 0) >> 5;
@@ -1084,7 +1084,7 @@ cc_state_init(drm_intel_bo * cc_state_bo,
cc_state->cc3.alpha_test = 0; /* disable alpha test */
cc_state->cc4.cc_viewport_state_offset =
- intel_emit_reloc(cc_state_bo, cc_state_offset +
+ intel_uxa_emit_reloc(cc_state_bo, cc_state_offset +
offsetof(struct brw_cc_unit_state, cc4),
cc_vp_bo, 0, I915_GEM_DOMAIN_INSTRUCTION, 0) >> 5;
@@ -1125,7 +1125,7 @@ static drm_intel_bo *gen4_create_wm_state(intel_screen_private *intel,
state = memset(wm_state_bo->virtual, 0, sizeof(*state));
state->thread0.grf_reg_count = BRW_GRF_BLOCKS(PS_KERNEL_NUM_GRF);
state->thread0.kernel_start_pointer =
- intel_emit_reloc(wm_state_bo,
+ intel_uxa_emit_reloc(wm_state_bo,
offsetof(struct brw_wm_unit_state, thread0),
kernel_bo, state->thread0.grf_reg_count << 1,
I915_GEM_DOMAIN_INSTRUCTION, 0) >> 6;
@@ -1149,7 +1149,7 @@ static drm_intel_bo *gen4_create_wm_state(intel_screen_private *intel,
state->wm4.sampler_count = 1; /* 1-4 samplers used */
state->wm4.sampler_state_pointer =
- intel_emit_reloc(wm_state_bo,
+ intel_uxa_emit_reloc(wm_state_bo,
offsetof(struct brw_wm_unit_state, wm4),
sampler_bo,
state->wm4.sampler_count << 2,
@@ -1219,7 +1219,7 @@ static drm_intel_bo *gen4_create_vs_unit_state(intel_screen_private *intel)
vs_state.vs6.vs_enable = 0;
vs_state.vs6.vert_cache_disable = 1;
- return intel_bo_alloc_for_data(intel, &vs_state, sizeof(vs_state),
+ return intel_uxa_bo_alloc_for_data(intel, &vs_state, sizeof(vs_state),
"gen4 render VS state");
}
@@ -1309,7 +1309,7 @@ gen4_set_picture_surface_state(intel_screen_private *intel,
PicturePtr picture, PixmapPtr pixmap,
Bool is_dst)
{
- struct intel_pixmap *priv = intel_get_pixmap_private(pixmap);
+ struct intel_uxa_pixmap *priv = intel_uxa_get_pixmap_private(pixmap);
struct brw_surface_state *ss;
uint32_t write_domain, read_domains;
int offset;
@@ -1341,7 +1341,7 @@ gen4_set_picture_surface_state(intel_screen_private *intel,
ss->ss2.width = pixmap->drawable.width - 1;
ss->ss3.pitch = intel_pixmap_pitch(pixmap) - 1;
ss->ss3.tile_walk = 0; /* Tiled X */
- ss->ss3.tiled_surface = intel_pixmap_tiled(pixmap) ? 1 : 0;
+ ss->ss3.tiled_surface = intel_uxa_pixmap_tiled(pixmap) ? 1 : 0;
dri_bo_emit_reloc(intel->surface_bo,
read_domains, write_domain,
@@ -1361,7 +1361,7 @@ gen7_set_picture_surface_state(intel_screen_private *intel,
PicturePtr picture, PixmapPtr pixmap,
Bool is_dst)
{
- struct intel_pixmap *priv = intel_get_pixmap_private(pixmap);
+ struct intel_uxa_pixmap *priv = intel_uxa_get_pixmap_private(pixmap);
struct gen7_surface_state *ss;
uint32_t write_domain, read_domains;
int offset;
@@ -1386,7 +1386,7 @@ gen7_set_picture_surface_state(intel_screen_private *intel,
ss->ss0.surface_format = i965_get_card_format(picture);
ss->ss0.tile_walk = 0; /* Tiled X */
- ss->ss0.tiled_surface = intel_pixmap_tiled(pixmap) ? 1 : 0;
+ ss->ss0.tiled_surface = intel_uxa_pixmap_tiled(pixmap) ? 1 : 0;
ss->ss1.base_addr = priv->bo->offset;
ss->ss2.height = pixmap->drawable.height - 1;
@@ -1819,19 +1819,19 @@ i965_emit_composite_primitive_affine_source(intel_screen_private *intel,
{
float src_x[3], src_y[3];
- if (!intel_get_transformed_coordinates(srcX, srcY,
+ if (!intel_uxa_get_transformed_coordinates(srcX, srcY,
intel->transform[0],
&src_x[0],
&src_y[0]))
return;
- if (!intel_get_transformed_coordinates(srcX, srcY + h,
+ if (!intel_uxa_get_transformed_coordinates(srcX, srcY + h,
intel->transform[0],
&src_x[1],
&src_y[1]))
return;
- if (!intel_get_transformed_coordinates(srcX + w, srcY + h,
+ if (!intel_uxa_get_transformed_coordinates(srcX + w, srcY + h,
intel->transform[0],
&src_x[2],
&src_y[2]))
@@ -1893,39 +1893,39 @@ i965_emit_composite_primitive(intel_screen_private *intel,
Bool is_affine = intel->gen4_render_state->composite_op.is_affine;
if (is_affine) {
- if (!intel_get_transformed_coordinates(srcX, srcY,
+ if (!intel_uxa_get_transformed_coordinates(srcX, srcY,
intel->transform[0],
&src_x[0],
&src_y[0]))
return;
- if (!intel_get_transformed_coordinates(srcX, srcY + h,
+ if (!intel_uxa_get_transformed_coordinates(srcX, srcY + h,
intel->transform[0],
&src_x[1],
&src_y[1]))
return;
- if (!intel_get_transformed_coordinates(srcX + w, srcY + h,
+ if (!intel_uxa_get_transformed_coordinates(srcX + w, srcY + h,
intel->transform[0],
&src_x[2],
&src_y[2]))
return;
} else {
- if (!intel_get_transformed_coordinates_3d(srcX, srcY,
+ if (!intel_uxa_get_transformed_coordinates_3d(srcX, srcY,
intel->transform[0],
&src_x[0],
&src_y[0],
&src_w[0]))
return;
- if (!intel_get_transformed_coordinates_3d(srcX, srcY + h,
+ if (!intel_uxa_get_transformed_coordinates_3d(srcX, srcY + h,
intel->transform[0],
&src_x[1],
&src_y[1],
&src_w[1]))
return;
- if (!intel_get_transformed_coordinates_3d(srcX + w, srcY + h,
+ if (!intel_uxa_get_transformed_coordinates_3d(srcX + w, srcY + h,
intel->transform[0],
&src_x[2],
&src_y[2],
@@ -1935,39 +1935,39 @@ i965_emit_composite_primitive(intel_screen_private *intel,
if (intel->render_mask) {
if (is_affine) {
- if (!intel_get_transformed_coordinates(maskX, maskY,
+ if (!intel_uxa_get_transformed_coordinates(maskX, maskY,
intel->transform[1],
&mask_x[0],
&mask_y[0]))
return;
- if (!intel_get_transformed_coordinates(maskX, maskY + h,
+ if (!intel_uxa_get_transformed_coordinates(maskX, maskY + h,
intel->transform[1],
&mask_x[1],
&mask_y[1]))
return;
- if (!intel_get_transformed_coordinates(maskX + w, maskY + h,
+ if (!intel_uxa_get_transformed_coordinates(maskX + w, maskY + h,
intel->transform[1],
&mask_x[2],
&mask_y[2]))
return;
} else {
- if (!intel_get_transformed_coordinates_3d(maskX, maskY,
+ if (!intel_uxa_get_transformed_coordinates_3d(maskX, maskY,
intel->transform[1],
&mask_x[0],
&mask_y[0],
&mask_w[0]))
return;
- if (!intel_get_transformed_coordinates_3d(maskX, maskY + h,
+ if (!intel_uxa_get_transformed_coordinates_3d(maskX, maskY + h,
intel->transform[1],
&mask_x[1],
&mask_y[1],
&mask_w[1]))
return;
- if (!intel_get_transformed_coordinates_3d(maskX + w, maskY + h,
+ if (!intel_uxa_get_transformed_coordinates_3d(maskX + w, maskY + h,
intel->transform[1],
&mask_x[2],
&mask_y[2],
@@ -2029,14 +2029,14 @@ i965_prepare_composite(int op, PicturePtr source_picture,
composite_op->src_filter =
sampler_state_filter_from_picture(source_picture->filter);
if (composite_op->src_filter == SS_INVALID_FILTER) {
- intel_debug_fallback(scrn, "Bad src filter 0x%x\n",
+ intel_uxa_debug_fallback(scrn, "Bad src filter 0x%x\n",
source_picture->filter);
return FALSE;
}
composite_op->src_extend =
sampler_state_extend_from_picture(source_picture->repeatType);
if (composite_op->src_extend == SS_INVALID_EXTEND) {
- intel_debug_fallback(scrn, "Bad src repeat 0x%x\n",
+ intel_uxa_debug_fallback(scrn, "Bad src repeat 0x%x\n",
source_picture->repeatType);
return FALSE;
}
@@ -2050,7 +2050,7 @@ i965_prepare_composite(int op, PicturePtr source_picture,
*/
if (i965_blend_op[op].src_alpha &&
(i965_blend_op[op].src_blend != BRW_BLENDFACTOR_ZERO)) {
- intel_debug_fallback(scrn,
+ intel_uxa_debug_fallback(scrn,
"Component alpha not supported "
"with source alpha and source "
"value blending.\n");
@@ -2061,14 +2061,14 @@ i965_prepare_composite(int op, PicturePtr source_picture,
composite_op->mask_filter =
sampler_state_filter_from_picture(mask_picture->filter);
if (composite_op->mask_filter == SS_INVALID_FILTER) {
- intel_debug_fallback(scrn, "Bad mask filter 0x%x\n",
+ intel_uxa_debug_fallback(scrn, "Bad mask filter 0x%x\n",
mask_picture->filter);
return FALSE;
}
composite_op->mask_extend =
sampler_state_extend_from_picture(mask_picture->repeatType);
if (composite_op->mask_extend == SS_INVALID_EXTEND) {
- intel_debug_fallback(scrn, "Bad mask repeat 0x%x\n",
+ intel_uxa_debug_fallback(scrn, "Bad mask repeat 0x%x\n",
mask_picture->repeatType);
return FALSE;
}
@@ -2078,7 +2078,7 @@ i965_prepare_composite(int op, PicturePtr source_picture,
}
/* Flush any pending writes prior to relocating the textures. */
- if (intel_pixmap_is_dirty(source) || intel_pixmap_is_dirty(mask))
+ if (intel_uxa_pixmap_is_dirty(source) || intel_uxa_pixmap_is_dirty(mask))
intel_batch_emit_flush(scrn);
composite_op->op = op;
@@ -2093,7 +2093,7 @@ i965_prepare_composite(int op, PicturePtr source_picture,
intel->scale_units[0][1] = 1. / source->drawable.height;
intel->transform[0] = source_picture->transform;
- composite_op->is_affine = intel_transform_is_affine(intel->transform[0]);
+ composite_op->is_affine = intel_uxa_transform_is_affine(intel->transform[0]);
if (mask_picture == NULL) {
intel->transform[1] = NULL;
@@ -2105,7 +2105,7 @@ i965_prepare_composite(int op, PicturePtr source_picture,
intel->scale_units[1][0] = 1. / mask->drawable.width;
intel->scale_units[1][1] = 1. / mask->drawable.height;
composite_op->is_affine &=
- intel_transform_is_affine(intel->transform[1]);
+ intel_uxa_transform_is_affine(intel->transform[1]);
}
if (mask) {
@@ -2159,7 +2159,7 @@ i965_prepare_composite(int op, PicturePtr source_picture,
if (!i965_composite_check_aperture(intel)) {
intel_batch_submit(scrn);
if (!i965_composite_check_aperture(intel)) {
- intel_debug_fallback(scrn,
+ intel_uxa_debug_fallback(scrn,
"Couldn't fit render operation "
"in aperture\n");
return FALSE;
@@ -2367,21 +2367,21 @@ void gen4_render_state_init(ScrnInfoPtr scrn)
/* Set up the two SF states (one for blending with a mask, one without) */
if (IS_GEN5(intel)) {
- sf_kernel_bo = intel_bo_alloc_for_data(intel,
+ sf_kernel_bo = intel_uxa_bo_alloc_for_data(intel,
sf_kernel_static_gen5,
sizeof
(sf_kernel_static_gen5),
"sf kernel gen5");
sf_kernel_mask_bo =
- intel_bo_alloc_for_data(intel, sf_kernel_mask_static_gen5,
+ intel_uxa_bo_alloc_for_data(intel, sf_kernel_mask_static_gen5,
sizeof(sf_kernel_mask_static_gen5),
"sf mask kernel");
} else {
- sf_kernel_bo = intel_bo_alloc_for_data(intel,
+ sf_kernel_bo = intel_uxa_bo_alloc_for_data(intel,
sf_kernel_static,
sizeof(sf_kernel_static),
"sf kernel");
- sf_kernel_mask_bo = intel_bo_alloc_for_data(intel,
+ sf_kernel_mask_bo = intel_uxa_bo_alloc_for_data(intel,
sf_kernel_mask_static,
sizeof
(sf_kernel_mask_static),
@@ -2395,7 +2395,7 @@ void gen4_render_state_init(ScrnInfoPtr scrn)
wm_kernels = IS_GEN5(intel) ? wm_kernels_gen5 : wm_kernels_gen4;
for (m = 0; m < KERNEL_COUNT; m++) {
render->wm_kernel_bo[m] =
- intel_bo_alloc_for_data(intel,
+ intel_uxa_bo_alloc_for_data(intel,
wm_kernels[m].data,
wm_kernels[m].size,
"WM kernel");
@@ -2919,7 +2919,7 @@ gen6_render_state_init(ScrnInfoPtr scrn)
wm_kernels = IS_GEN7(intel) ? wm_kernels_gen7 : wm_kernels_gen6;
for (m = 0; m < KERNEL_COUNT; m++) {
render->wm_kernel_bo[m] =
- intel_bo_alloc_for_data(intel,
+ intel_uxa_bo_alloc_for_data(intel,
wm_kernels[m].data,
wm_kernels[m].size,
"WM kernel gen6/7");
diff --git a/src/uxa/i965_video.c b/src/uxa/i965_video.c
index 54f5fa7f..252a6a04 100644
--- a/src/uxa/i965_video.c
+++ b/src/uxa/i965_video.c
@@ -388,7 +388,7 @@ static void i965_create_dst_surface_state(ScrnInfoPtr scrn,
{
intel_screen_private *intel = intel_get_screen_private(scrn);
struct brw_surface_state dest_surf_state;
- drm_intel_bo *pixmap_bo = intel_get_pixmap_bo(pixmap);
+ drm_intel_bo *pixmap_bo = intel_uxa_get_pixmap_bo(pixmap);
assert(pixmap_bo != NULL);
memset(&dest_surf_state, 0, sizeof(dest_surf_state));
@@ -414,7 +414,7 @@ static void i965_create_dst_surface_state(ScrnInfoPtr scrn,
dest_surf_state.ss0.render_cache_read_mode = 0;
dest_surf_state.ss1.base_addr =
- intel_emit_reloc(surf_bo, offset + offsetof(struct brw_surface_state, ss1),
+ intel_uxa_emit_reloc(surf_bo, offset + offsetof(struct brw_surface_state, ss1),
pixmap_bo, 0, I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER);
dest_surf_state.ss2.height = pixmap->drawable.height - 1;
@@ -422,7 +422,7 @@ static void i965_create_dst_surface_state(ScrnInfoPtr scrn,
dest_surf_state.ss2.mip_count = 0;
dest_surf_state.ss2.render_target_rotation = 0;
dest_surf_state.ss3.pitch = intel_pixmap_pitch(pixmap) - 1;
- dest_surf_state.ss3.tiled_surface = intel_pixmap_tiled(pixmap);
+ dest_surf_state.ss3.tiled_surface = intel_uxa_pixmap_tiled(pixmap);
dest_surf_state.ss3.tile_walk = 0; /* TileX */
dri_bo_subdata(surf_bo,
@@ -465,7 +465,7 @@ static void i965_create_src_surface_state(ScrnInfoPtr scrn,
if (src_bo) {
src_surf_state.ss1.base_addr =
- intel_emit_reloc(surface_bo,
+ intel_uxa_emit_reloc(surface_bo,
offset + offsetof(struct brw_surface_state, ss1),
src_bo, src_offset,
I915_GEM_DOMAIN_SAMPLER, 0);
@@ -485,13 +485,13 @@ static void gen7_create_dst_surface_state(ScrnInfoPtr scrn,
{
intel_screen_private *intel = intel_get_screen_private(scrn);
struct gen7_surface_state dest_surf_state;
- drm_intel_bo *pixmap_bo = intel_get_pixmap_bo(pixmap);
+ drm_intel_bo *pixmap_bo = intel_uxa_get_pixmap_bo(pixmap);
assert(pixmap_bo != NULL);
memset(&dest_surf_state, 0, sizeof(dest_surf_state));
dest_surf_state.ss0.surface_type = BRW_SURFACE_2D;
- dest_surf_state.ss0.tiled_surface = intel_pixmap_tiled(pixmap);
+ dest_surf_state.ss0.tiled_surface = intel_uxa_pixmap_tiled(pixmap);
dest_surf_state.ss0.tile_walk = 0; /* TileX */
if (intel->cpp == 2) {
@@ -501,7 +501,7 @@ static void gen7_create_dst_surface_state(ScrnInfoPtr scrn,
}
dest_surf_state.ss1.base_addr =
- intel_emit_reloc(surf_bo,
+ intel_uxa_emit_reloc(surf_bo,
offset + offsetof(struct gen7_surface_state, ss1),
pixmap_bo, 0,
I915_GEM_DOMAIN_SAMPLER, 0);
@@ -543,7 +543,7 @@ static void gen7_create_src_surface_state(ScrnInfoPtr scrn,
if (src_bo) {
src_surf_state.ss1.base_addr =
- intel_emit_reloc(surface_bo,
+ intel_uxa_emit_reloc(surface_bo,
offset + offsetof(struct gen7_surface_state, ss1),
src_bo, src_offset,
I915_GEM_DOMAIN_SAMPLER, 0);
@@ -596,7 +596,7 @@ static drm_intel_bo *i965_create_sampler_state(ScrnInfoPtr scrn)
sampler_state.ss1.s_wrap_mode = BRW_TEXCOORDMODE_CLAMP;
sampler_state.ss1.t_wrap_mode = BRW_TEXCOORDMODE_CLAMP;
- return intel_bo_alloc_for_data(intel,
+ return intel_uxa_bo_alloc_for_data(intel,
&sampler_state, sizeof(sampler_state),
"textured video sampler state");
}
@@ -613,7 +613,7 @@ static drm_intel_bo *gen7_create_sampler_state(ScrnInfoPtr scrn)
sampler_state.ss3.s_wrap_mode = BRW_TEXCOORDMODE_CLAMP;
sampler_state.ss3.t_wrap_mode = BRW_TEXCOORDMODE_CLAMP;
- return intel_bo_alloc_for_data(intel,
+ return intel_uxa_bo_alloc_for_data(intel,
&sampler_state, sizeof(sampler_state),
"textured video sampler state");
}
@@ -633,7 +633,7 @@ static drm_intel_bo *i965_create_vs_state(ScrnInfoPtr scrn)
vs_state.vs6.vs_enable = 0;
vs_state.vs6.vert_cache_disable = 1;
- return intel_bo_alloc_for_data(intel,
+ return intel_uxa_bo_alloc_for_data(intel,
&vs_state, sizeof(vs_state),
"textured video vs state");
}
@@ -643,7 +643,7 @@ static drm_intel_bo *i965_create_program(ScrnInfoPtr scrn,
unsigned int program_size)
{
intel_screen_private *intel = intel_get_screen_private(scrn);
- return intel_bo_alloc_for_data(intel,
+ return intel_uxa_bo_alloc_for_data(intel,
program, program_size,
"textured video program");
}
@@ -680,7 +680,7 @@ static drm_intel_bo *i965_create_sf_state(ScrnInfoPtr scrn)
memset(&sf_state, 0, sizeof(sf_state));
sf_state.thread0.grf_reg_count = BRW_GRF_BLOCKS(SF_KERNEL_NUM_GRF);
sf_state.thread0.kernel_start_pointer =
- intel_emit_reloc(sf_bo, offsetof(struct brw_sf_unit_state, thread0),
+ intel_uxa_emit_reloc(sf_bo, offsetof(struct brw_sf_unit_state, thread0),
kernel_bo, sf_state.thread0.grf_reg_count << 1,
I915_GEM_DOMAIN_INSTRUCTION, 0) >> 6;
sf_state.sf1.single_program_flow = 1; /* XXX */
@@ -764,7 +764,7 @@ static drm_intel_bo *i965_create_wm_state(ScrnInfoPtr scrn,
memset(&wm_state, 0, sizeof(wm_state));
wm_state.thread0.grf_reg_count = BRW_GRF_BLOCKS(PS_KERNEL_NUM_GRF);
wm_state.thread0.kernel_start_pointer =
- intel_emit_reloc(wm_bo, offsetof(struct brw_wm_unit_state, thread0),
+ intel_uxa_emit_reloc(wm_bo, offsetof(struct brw_wm_unit_state, thread0),
kernel_bo, wm_state.thread0.grf_reg_count << 1,
I915_GEM_DOMAIN_INSTRUCTION, 0) >> 6;
wm_state.thread1.single_program_flow = 1; /* XXX */
@@ -791,7 +791,7 @@ static drm_intel_bo *i965_create_wm_state(ScrnInfoPtr scrn,
wm_state.thread3.urb_entry_read_offset = 0; /* XXX */
wm_state.wm4.stats_enable = 1;
wm_state.wm4.sampler_state_pointer =
- intel_emit_reloc(wm_bo, offsetof(struct brw_wm_unit_state, wm4),
+ intel_uxa_emit_reloc(wm_bo, offsetof(struct brw_wm_unit_state, wm4),
sampler_bo, 0,
I915_GEM_DOMAIN_INSTRUCTION, 0) >> 5;
if (IS_GEN5(intel))
@@ -818,7 +818,7 @@ static drm_intel_bo *i965_create_cc_vp_state(ScrnInfoPtr scrn)
cc_viewport.min_depth = -1.e35;
cc_viewport.max_depth = 1.e35;
- return intel_bo_alloc_for_data(intel,
+ return intel_uxa_bo_alloc_for_data(intel,
&cc_viewport, sizeof(cc_viewport),
"textured video cc viewport");
}
@@ -850,7 +850,7 @@ static drm_intel_bo *i965_create_cc_state(ScrnInfoPtr scrn)
cc_state.cc3.blend_enable = 0; /* disable color blend */
cc_state.cc3.alpha_test = 0; /* disable alpha test */
cc_state.cc4.cc_viewport_state_offset =
- intel_emit_reloc(cc_bo, offsetof(struct brw_cc_unit_state, cc4),
+ intel_uxa_emit_reloc(cc_bo, offsetof(struct brw_cc_unit_state, cc4),
cc_vp_bo, 0, I915_GEM_DOMAIN_INSTRUCTION, 0) >> 5;
cc_state.cc5.dither_enable = 0; /* disable dither */
cc_state.cc5.logicop_func = 0xc; /* WHITE */
@@ -1287,7 +1287,7 @@ I965DisplayVideoTextured(ScrnInfoPtr scrn,
vb[i++] = (float)box_x1 + pix_xoff;
vb[i++] = (float)box_y1 + pix_yoff;
- bo_table[0] = intel_bo_alloc_for_data(intel,
+ bo_table[0] = intel_uxa_bo_alloc_for_data(intel,
vb, sizeof(vb),
"textured video vbo");
@@ -1341,7 +1341,7 @@ I965DisplayVideoTextured(ScrnInfoPtr scrn,
/* release reference once we're finished */
drm_intel_bo_unreference(surface_state_binding_table_bo);
- intel_debug_flush(scrn);
+ intel_uxa_debug_flush(scrn);
}
void i965_free_video(ScrnInfoPtr scrn)
@@ -1387,7 +1387,7 @@ gen6_create_cc_state(ScrnInfoPtr scrn)
cc_state.constant_b = 1.0;
cc_state.constant_a = 1.0;
- return intel_bo_alloc_for_data(intel,
+ return intel_uxa_bo_alloc_for_data(intel,
&cc_state, sizeof(cc_state),
"textured video cc state");
}
@@ -1403,7 +1403,7 @@ gen6_create_blend_state(ScrnInfoPtr scrn)
blend_state.blend1.logic_op_func = 0xc;
blend_state.blend1.pre_blend_clamp_enable = 1;
- return intel_bo_alloc_for_data(intel,
+ return intel_uxa_bo_alloc_for_data(intel,
&blend_state, sizeof(blend_state),
"textured video blend state");
}
@@ -1415,7 +1415,7 @@ gen6_create_depth_stencil_state(ScrnInfoPtr scrn)
struct gen6_depth_stencil_state depth_stencil_state;
memset(&depth_stencil_state, 0, sizeof(depth_stencil_state));
- return intel_bo_alloc_for_data(intel,
+ return intel_uxa_bo_alloc_for_data(intel,
&depth_stencil_state,
sizeof(depth_stencil_state),
"textured video blend state");
@@ -1917,7 +1917,7 @@ void Gen6DisplayVideoTextured(ScrnInfoPtr scrn,
vb[i++] = (float)box_x1 + pix_xoff;
vb[i++] = (float)box_y1 + pix_yoff;
- bo_table[0] = intel_bo_alloc_for_data(intel,
+ bo_table[0] = intel_uxa_bo_alloc_for_data(intel,
vb, sizeof(vb),
"video vbo");
@@ -1936,5 +1936,5 @@ void Gen6DisplayVideoTextured(ScrnInfoPtr scrn,
/* release reference once we're finished */
drm_intel_bo_unreference(surface_state_binding_table_bo);
- intel_debug_flush(scrn);
+ intel_uxa_debug_flush(scrn);
}
diff --git a/src/uxa/intel.h b/src/uxa/intel.h
index b7a9f4b8..3dddc645 100644
--- a/src/uxa/intel.h
+++ b/src/uxa/intel.h
@@ -93,63 +93,6 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#define MAX_PIPES 4 /* consider making all users dynamic */
-struct intel_pixmap {
- dri_bo *bo;
-
- struct list batch;
-
- uint8_t tiling;
- int8_t busy :2;
- uint8_t dirty :1;
- uint8_t offscreen :1;
- uint8_t pinned :5;
-#define PIN_SCANOUT 0x1
-#define PIN_DRI2 0x2
-#define PIN_DRI3 0x4
-#define PIN_PRIME 0x8
-#define PIN_GLAMOR 0x10
-};
-
-#if HAS_DEVPRIVATEKEYREC
-extern DevPrivateKeyRec uxa_pixmap_index;
-#else
-extern int uxa_pixmap_index;
-#endif
-
-static inline struct intel_pixmap *intel_get_pixmap_private(PixmapPtr pixmap)
-{
-#if HAS_DEVPRIVATEKEYREC
- return dixGetPrivate(&pixmap->devPrivates, &uxa_pixmap_index);
-#else
- return dixLookupPrivate(&pixmap->devPrivates, &uxa_pixmap_index);
-#endif
-}
-
-static inline Bool intel_pixmap_is_busy(struct intel_pixmap *priv)
-{
- if (priv->busy == -1)
- priv->busy = drm_intel_bo_busy(priv->bo);
- return priv->busy;
-}
-
-static inline void intel_set_pixmap_private(PixmapPtr pixmap, struct intel_pixmap *intel)
-{
- dixSetPrivate(&pixmap->devPrivates, &uxa_pixmap_index, intel);
-}
-
-static inline Bool intel_pixmap_is_dirty(PixmapPtr pixmap)
-{
- return pixmap && intel_get_pixmap_private(pixmap)->dirty;
-}
-
-static inline Bool intel_pixmap_tiled(PixmapPtr pixmap)
-{
- return intel_get_pixmap_private(pixmap)->tiling != I915_TILING_NONE;
-}
-
-dri_bo *intel_get_pixmap_bo(PixmapPtr pixmap);
-void intel_set_pixmap_bo(PixmapPtr pixmap, dri_bo * bo);
-
#include "common.h"
#define PITCH_NONE 0
@@ -500,22 +443,10 @@ intel_get_screen_private(ScrnInfoPtr scrn)
#define MIN(a,b) ((a) < (b) ? (a) : (b))
#endif
-static inline int intel_pixmap_pitch(PixmapPtr pixmap)
-{
- return pixmap->devKind;
-}
-
-/* Batchbuffer support macros and functions */
-#include "intel_batchbuffer.h"
-
-/* I830 specific functions */
-extern void IntelEmitInvarientState(ScrnInfoPtr scrn);
-extern void I830EmitInvarientState(ScrnInfoPtr scrn);
-extern void I915EmitInvarientState(ScrnInfoPtr scrn);
+extern void intel_video_init(ScreenPtr pScreen);
+extern void intel_box_intersect(BoxPtr dest, BoxPtr a, BoxPtr b);
+extern void intel_crtc_box(xf86CrtcPtr crtc, BoxPtr crtc_box);
-extern void I830EmitFlush(ScrnInfoPtr scrn);
-
-extern void I830InitVideo(ScreenPtr pScreen);
extern xf86CrtcPtr intel_covering_crtc(ScrnInfoPtr scrn, BoxPtr box,
xf86CrtcPtr desired, BoxPtr crtc_box_ret);
@@ -549,170 +480,6 @@ drm_intel_bo *intel_allocate_framebuffer(ScrnInfoPtr scrn,
int *out_stride,
uint32_t *out_tiling);
-/* i830_render.c */
-Bool i830_check_composite(int op,
- PicturePtr sourcec, PicturePtr mask, PicturePtr dest,
- int width, int height);
-Bool i830_check_composite_target(PixmapPtr pixmap);
-Bool i830_check_composite_texture(ScreenPtr screen, PicturePtr picture);
-Bool i830_prepare_composite(int op, PicturePtr sourcec, PicturePtr mask,
- PicturePtr dest, PixmapPtr sourcecPixmap,
- PixmapPtr maskPixmap, PixmapPtr destPixmap);
-void i830_composite(PixmapPtr dest, int srcX, int srcY,
- int maskX, int maskY, int dstX, int dstY, int w, int h);
-void i830_vertex_flush(intel_screen_private *intel);
-
-/* i915_render.c */
-Bool i915_check_composite(int op,
- PicturePtr sourcec, PicturePtr mask, PicturePtr dest,
- int width, int height);
-Bool i915_check_composite_target(PixmapPtr pixmap);
-Bool i915_check_composite_texture(ScreenPtr screen, PicturePtr picture);
-Bool i915_prepare_composite(int op, PicturePtr sourcec, PicturePtr mask,
- PicturePtr dest, PixmapPtr sourcecPixmap,
- PixmapPtr maskPixmap, PixmapPtr destPixmap);
-void i915_composite(PixmapPtr dest, int srcX, int srcY,
- int maskX, int maskY, int dstX, int dstY, int w, int h);
-void i915_vertex_flush(intel_screen_private *intel);
-void i915_batch_commit_notify(intel_screen_private *intel);
-void i830_batch_commit_notify(intel_screen_private *intel);
-/* i965_render.c */
-unsigned int gen4_render_state_size(ScrnInfoPtr scrn);
-void gen4_render_state_init(ScrnInfoPtr scrn);
-void gen4_render_state_cleanup(ScrnInfoPtr scrn);
-Bool i965_check_composite(int op,
- PicturePtr sourcec, PicturePtr mask, PicturePtr dest,
- int width, int height);
-Bool i965_check_composite_texture(ScreenPtr screen, PicturePtr picture);
-Bool i965_prepare_composite(int op, PicturePtr sourcec, PicturePtr mask,
- PicturePtr dest, PixmapPtr sourcecPixmap,
- PixmapPtr maskPixmap, PixmapPtr destPixmap);
-void i965_composite(PixmapPtr dest, int srcX, int srcY,
- int maskX, int maskY, int dstX, int dstY, int w, int h);
-
-void i965_vertex_flush(intel_screen_private *intel);
-void i965_batch_flush(intel_screen_private *intel);
-void i965_batch_commit_notify(intel_screen_private *intel);
-
-/* i965_3d.c */
-void gen6_upload_invariant_states(intel_screen_private *intel);
-void gen6_upload_viewport_state_pointers(intel_screen_private *intel,
- drm_intel_bo *cc_vp_bo);
-void gen7_upload_viewport_state_pointers(intel_screen_private *intel,
- drm_intel_bo *cc_vp_bo);
-void gen6_upload_urb(intel_screen_private *intel);
-void gen7_upload_urb(intel_screen_private *intel);
-void gen6_upload_cc_state_pointers(intel_screen_private *intel,
- drm_intel_bo *blend_bo, drm_intel_bo *cc_bo,
- drm_intel_bo *depth_stencil_bo,
- uint32_t blend_offset);
-void gen7_upload_cc_state_pointers(intel_screen_private *intel,
- drm_intel_bo *blend_bo, drm_intel_bo *cc_bo,
- drm_intel_bo *depth_stencil_bo,
- uint32_t blend_offset);
-void gen6_upload_sampler_state_pointers(intel_screen_private *intel,
- drm_intel_bo *sampler_bo);
-void gen7_upload_sampler_state_pointers(intel_screen_private *intel,
- drm_intel_bo *sampler_bo);
-void gen7_upload_bypass_states(intel_screen_private *intel);
-void gen6_upload_gs_state(intel_screen_private *intel);
-void gen6_upload_vs_state(intel_screen_private *intel);
-void gen6_upload_clip_state(intel_screen_private *intel);
-void gen6_upload_sf_state(intel_screen_private *intel, int num_sf_outputs, int read_offset);
-void gen7_upload_sf_state(intel_screen_private *intel, int num_sf_outputs, int read_offset);
-void gen6_upload_binding_table(intel_screen_private *intel, uint32_t ps_binding_table_offset);
-void gen7_upload_binding_table(intel_screen_private *intel, uint32_t ps_binding_table_offset);
-void gen6_upload_depth_buffer_state(intel_screen_private *intel);
-void gen7_upload_depth_buffer_state(intel_screen_private *intel);
-
-Bool intel_transform_is_affine(PictTransformPtr t);
-Bool
-intel_get_transformed_coordinates(int x, int y, PictTransformPtr transform,
- float *x_out, float *y_out);
-
-Bool
-intel_get_transformed_coordinates_3d(int x, int y, PictTransformPtr transform,
- float *x_out, float *y_out, float *z_out);
-
-static inline void
-intel_debug_fallback(ScrnInfoPtr scrn, const char *format, ...) _X_ATTRIBUTE_PRINTF(2, 3);
-
-static inline void
-intel_debug_fallback(ScrnInfoPtr scrn, const char *format, ...)
-{
- intel_screen_private *intel = intel_get_screen_private(scrn);
- va_list ap;
-
- va_start(ap, format);
- if (intel->fallback_debug) {
- xf86DrvMsg(scrn->scrnIndex, X_INFO, "fallback: ");
- LogVMessageVerb(X_INFO, 1, format, ap);
- }
- va_end(ap);
-}
-
-static inline Bool
-intel_check_pitch_2d(PixmapPtr pixmap)
-{
- uint32_t pitch = intel_pixmap_pitch(pixmap);
- if (pitch > KB(32)) {
- ScrnInfoPtr scrn = xf86ScreenToScrn(pixmap->drawable.pScreen);
- intel_debug_fallback(scrn, "pitch exceeds 2d limit 32K\n");
- return FALSE;
- }
- return TRUE;
-}
-
-/* For pre-965 chip only, as they have 8KB limit for 3D */
-static inline Bool
-intel_check_pitch_3d(PixmapPtr pixmap)
-{
- uint32_t pitch = intel_pixmap_pitch(pixmap);
- if (pitch > KB(8)) {
- ScrnInfoPtr scrn = xf86ScreenToScrn(pixmap->drawable.pScreen);
- intel_debug_fallback(scrn, "pitch exceeds 3d limit 8K\n");
- return FALSE;
- }
- return TRUE;
-}
-
-/**
- * Little wrapper around drm_intel_bo_reloc to return the initial value you
- * should stuff into the relocation entry.
- *
- * If only we'd done this before settling on the library API.
- */
-static inline uint32_t
-intel_emit_reloc(drm_intel_bo * bo, uint32_t offset,
- drm_intel_bo * target_bo, uint32_t target_offset,
- uint32_t read_domains, uint32_t write_domain)
-{
- drm_intel_bo_emit_reloc(bo, offset, target_bo, target_offset,
- read_domains, write_domain);
-
- return target_bo->offset + target_offset;
-}
-
-static inline drm_intel_bo *intel_bo_alloc_for_data(intel_screen_private *intel,
- const void *data,
- unsigned int size,
- const char *name)
-{
- drm_intel_bo *bo;
- int ret;
-
- bo = drm_intel_bo_alloc(intel->bufmgr, name, size, 4096);
- assert(bo);
-
- ret = drm_intel_bo_subdata(bo, 0, size, data);
- assert(ret == 0);
-
- return bo;
- (void)ret;
-}
-
-void intel_debug_flush(ScrnInfoPtr scrn);
-
static inline PixmapPtr get_drawable_pixmap(DrawablePtr drawable)
{
ScreenPtr screen = drawable->pScreen;
@@ -730,24 +497,19 @@ static inline Bool pixmap_is_scanout(PixmapPtr pixmap)
return pixmap == screen->GetScreenPixmap(screen);
}
-Bool intel_uxa_init(ScreenPtr pScreen);
-Bool intel_uxa_create_screen_resources(ScreenPtr pScreen);
-void intel_uxa_block_handler(intel_screen_private *intel);
-Bool intel_get_aperture_space(ScrnInfoPtr scrn, drm_intel_bo ** bo_table,
- int num_bos);
-
-static inline Bool intel_pixmap_is_offscreen(PixmapPtr pixmap)
+static inline int
+intel_pixmap_pitch(PixmapPtr pixmap)
{
- struct intel_pixmap *priv = intel_get_pixmap_private(pixmap);
- return priv && priv->offscreen;
+ return (unsigned long)pixmap->devKind;
}
+/*
+ * intel_sync.c
+ */
+
#if HAVE_DRI3
Bool intel_sync_init(ScreenPtr screen);
void intel_sync_close(ScreenPtr screen);
-#else
-static inline Bool intel_sync_init(ScreenPtr screen) { return 0; }
-void intel_sync_close(ScreenPtr screen);
#endif
/*
@@ -766,4 +528,12 @@ Bool intel_present_screen_init(ScreenPtr screen);
static inline Bool intel_present_screen_init(ScreenPtr screen) { return 0; }
#endif
+#include "intel_uxa.h"
+
+dri_bo *
+intel_get_pixmap_bo(PixmapPtr pixmap);
+
+void
+intel_set_pixmap_bo(PixmapPtr pixmap, dri_bo *bo);
+
#endif /* _I830_H_ */
diff --git a/src/uxa/intel_batchbuffer.c b/src/uxa/intel_batchbuffer.c
index dedf7f87..25349fcf 100644
--- a/src/uxa/intel_batchbuffer.c
+++ b/src/uxa/intel_batchbuffer.c
@@ -142,7 +142,7 @@ void intel_batch_teardown(ScrnInfoPtr scrn)
static void intel_batch_do_flush(ScrnInfoPtr scrn)
{
intel_screen_private *intel = intel_get_screen_private(scrn);
- struct intel_pixmap *priv;
+ struct intel_uxa_pixmap *priv;
list_for_each_entry(priv, &intel->batch_pixmaps, batch)
priv->dirty = 0;
@@ -289,10 +289,10 @@ void intel_batch_submit(ScrnInfoPtr scrn)
}
while (!list_is_empty(&intel->batch_pixmaps)) {
- struct intel_pixmap *entry;
+ struct intel_uxa_pixmap *entry;
entry = list_first_entry(&intel->batch_pixmaps,
- struct intel_pixmap,
+ struct intel_uxa_pixmap,
batch);
entry->busy = -1;
@@ -311,7 +311,7 @@ void intel_batch_submit(ScrnInfoPtr scrn)
intel->current_batch = 0;
}
-void intel_debug_flush(ScrnInfoPtr scrn)
+void intel_uxa_debug_flush(ScrnInfoPtr scrn)
{
intel_screen_private *intel = intel_get_screen_private(scrn);
diff --git a/src/uxa/intel_batchbuffer.h b/src/uxa/intel_batchbuffer.h
index 79e2ab07..e5fb8d08 100644
--- a/src/uxa/intel_batchbuffer.h
+++ b/src/uxa/intel_batchbuffer.h
@@ -129,7 +129,7 @@ intel_batch_emit_reloc(intel_screen_private *intel,
static inline void
intel_batch_mark_pixmap_domains(intel_screen_private *intel,
- struct intel_pixmap *priv,
+ struct intel_uxa_pixmap *priv,
uint32_t read_domains, uint32_t write_domain)
{
assert (read_domains);
@@ -149,7 +149,7 @@ intel_batch_emit_reloc_pixmap(intel_screen_private *intel, PixmapPtr pixmap,
uint32_t read_domains, uint32_t write_domain,
uint32_t delta, int needs_fence)
{
- struct intel_pixmap *priv = intel_get_pixmap_private(pixmap);
+ struct intel_uxa_pixmap *priv = intel_uxa_get_pixmap_private(pixmap);
intel_batch_mark_pixmap_domains(intel, priv, read_domains, write_domain);
diff --git a/src/uxa/intel_display.c b/src/uxa/intel_display.c
index 52370786..afff357d 100644
--- a/src/uxa/intel_display.c
+++ b/src/uxa/intel_display.c
@@ -2568,3 +2568,81 @@ restart_destroy:
out:
RRGetInfo(xf86ScrnToScreen(scrn), TRUE);
}
+
+void intel_box_intersect(BoxPtr dest, BoxPtr a, BoxPtr b)
+{
+ dest->x1 = a->x1 > b->x1 ? a->x1 : b->x1;
+ dest->x2 = a->x2 < b->x2 ? a->x2 : b->x2;
+ if (dest->x1 >= dest->x2) {
+ dest->x1 = dest->x2 = dest->y1 = dest->y2 = 0;
+ return;
+ }
+
+ dest->y1 = a->y1 > b->y1 ? a->y1 : b->y1;
+ dest->y2 = a->y2 < b->y2 ? a->y2 : b->y2;
+ if (dest->y1 >= dest->y2)
+ dest->x1 = dest->x2 = dest->y1 = dest->y2 = 0;
+}
+
+void intel_crtc_box(xf86CrtcPtr crtc, BoxPtr crtc_box)
+{
+ if (crtc->enabled) {
+ crtc_box->x1 = crtc->x;
+ crtc_box->x2 =
+ crtc->x + xf86ModeWidth(&crtc->mode, crtc->rotation);
+ crtc_box->y1 = crtc->y;
+ crtc_box->y2 =
+ crtc->y + xf86ModeHeight(&crtc->mode, crtc->rotation);
+ } else
+ crtc_box->x1 = crtc_box->x2 = crtc_box->y1 = crtc_box->y2 = 0;
+}
+
+static int intel_box_area(BoxPtr box)
+{
+ return (int)(box->x2 - box->x1) * (int)(box->y2 - box->y1);
+}
+
+/*
+ * Return the crtc covering 'box'. If two crtcs cover a portion of
+ * 'box', then prefer 'desired'. If 'desired' is NULL, then prefer the crtc
+ * with greater coverage
+ */
+
+xf86CrtcPtr
+intel_covering_crtc(ScrnInfoPtr scrn,
+ BoxPtr box, xf86CrtcPtr desired, BoxPtr crtc_box_ret)
+{
+ xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
+ xf86CrtcPtr crtc, best_crtc;
+ int coverage, best_coverage;
+ int c;
+ BoxRec crtc_box, cover_box;
+
+ best_crtc = NULL;
+ best_coverage = 0;
+ crtc_box_ret->x1 = 0;
+ crtc_box_ret->x2 = 0;
+ crtc_box_ret->y1 = 0;
+ crtc_box_ret->y2 = 0;
+ for (c = 0; c < xf86_config->num_crtc; c++) {
+ crtc = xf86_config->crtc[c];
+
+ /* If the CRTC is off, treat it as not covering */
+ if (!intel_crtc_on(crtc))
+ continue;
+
+ intel_crtc_box(crtc, &crtc_box);
+ intel_box_intersect(&cover_box, &crtc_box, box);
+ coverage = intel_box_area(&cover_box);
+ if (coverage && crtc == desired) {
+ *crtc_box_ret = crtc_box;
+ return crtc;
+ }
+ if (coverage > best_coverage) {
+ *crtc_box_ret = crtc_box;
+ best_crtc = crtc;
+ best_coverage = coverage;
+ }
+ }
+ return best_crtc;
+}
diff --git a/src/uxa/intel_dri.c b/src/uxa/intel_dri.c
index eb210f36..1042def8 100644
--- a/src/uxa/intel_dri.c
+++ b/src/uxa/intel_dri.c
@@ -82,7 +82,7 @@ static int i830_client_key;
static uint32_t pixmap_flink(PixmapPtr pixmap)
{
- struct intel_pixmap *priv = intel_get_pixmap_private(pixmap);
+ struct intel_uxa_pixmap *priv = intel_uxa_get_pixmap_private(pixmap);
uint32_t name;
if (priv == NULL || priv->bo == NULL)
@@ -113,7 +113,7 @@ static PixmapPtr fixup_glamor(DrawablePtr drawable, PixmapPtr pixmap)
ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
intel_screen_private *intel = intel_get_screen_private(scrn);
PixmapPtr old = get_drawable_pixmap(drawable);
- struct intel_pixmap *priv = intel_get_pixmap_private(pixmap);
+ struct intel_uxa_pixmap *priv = intel_uxa_get_pixmap_private(pixmap);
GCPtr gc;
/* With a glamor pixmap, 2D pixmaps are created in texture
@@ -140,12 +140,12 @@ static PixmapPtr fixup_glamor(DrawablePtr drawable, PixmapPtr pixmap)
FreeScratchGC(gc);
}
- intel_set_pixmap_private(pixmap, NULL);
+ intel_uxa_set_pixmap_private(pixmap, NULL);
/* Exchange the underlying texture/image. */
intel_glamor_exchange_buffers(intel, old, pixmap);
/* And redirect the pixmap to the new bo (for 3D). */
- intel_set_pixmap_private(old, priv);
+ intel_uxa_set_pixmap_private(old, priv);
old->refcnt++;
screen->ModifyPixmapHeader(old,
@@ -739,10 +739,10 @@ i830_dri2_del_frame_event(DRI2FrameEventPtr info)
free(info);
}
-static struct intel_pixmap *
+static struct intel_uxa_pixmap *
intel_exchange_pixmap_buffers(struct intel_screen_private *intel, PixmapPtr front, PixmapPtr back)
{
- struct intel_pixmap *new_front, *new_back;
+ struct intel_uxa_pixmap *new_front = NULL, *new_back;
RegionRec region;
/* Post damage on the front buffer so that listeners, such
@@ -755,10 +755,10 @@ intel_exchange_pixmap_buffers(struct intel_screen_private *intel, PixmapPtr fron
region.data = NULL;
DamageRegionAppend(&front->drawable, &region);
- new_front = intel_get_pixmap_private(back);
- new_back = intel_get_pixmap_private(front);
- intel_set_pixmap_private(front, new_front);
- intel_set_pixmap_private(back, new_back);
+ new_front = intel_uxa_get_pixmap_private(back);
+ new_back = intel_uxa_get_pixmap_private(front);
+ intel_uxa_set_pixmap_private(front, new_front);
+ intel_uxa_set_pixmap_private(back, new_back);
new_front->busy = 1;
new_back->busy = -1;
@@ -774,7 +774,7 @@ I830DRI2ExchangeBuffers(struct intel_screen_private *intel, DRI2BufferPtr front,
{
I830DRI2BufferPrivatePtr front_priv, back_priv;
int tmp;
- struct intel_pixmap *new_front;
+ struct intel_uxa_pixmap *new_front;
front_priv = front->driverPrivate;
back_priv = back->driverPrivate;
@@ -967,8 +967,8 @@ can_exchange(DrawablePtr drawable, DRI2BufferPtr front, DRI2BufferPtr back)
I830DRI2BufferPrivatePtr back_priv = back->driverPrivate;
PixmapPtr front_pixmap = front_priv->pixmap;
PixmapPtr back_pixmap = back_priv->pixmap;
- struct intel_pixmap *front_intel = intel_get_pixmap_private(front_pixmap);
- struct intel_pixmap *back_intel = intel_get_pixmap_private(back_pixmap);
+ struct intel_uxa_pixmap *front_intel = intel_uxa_get_pixmap_private(front_pixmap);
+ struct intel_uxa_pixmap *back_intel = intel_uxa_get_pixmap_private(back_pixmap);
if (!pScrn->vtSema)
return FALSE;
diff --git a/src/uxa/intel_dri3.c b/src/uxa/intel_dri3.c
index 8c362c93..914dff67 100644
--- a/src/uxa/intel_dri3.c
+++ b/src/uxa/intel_dri3.c
@@ -57,7 +57,7 @@ static PixmapPtr intel_dri3_pixmap_from_fd(ScreenPtr screen,
{
ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
intel_screen_private *intel = intel_get_screen_private(scrn);
- struct intel_pixmap *priv;
+ struct intel_uxa_pixmap *priv;
PixmapPtr pixmap;
dri_bo *bo;
@@ -89,10 +89,10 @@ static PixmapPtr intel_dri3_pixmap_from_fd(ScreenPtr screen,
if (bo == NULL)
goto free_pixmap;
- intel_set_pixmap_bo(pixmap, bo);
+ intel_uxa_set_pixmap_bo(pixmap, bo);
dri_bo_unreference(bo);
- priv = intel_get_pixmap_private(pixmap);
+ priv = intel_uxa_get_pixmap_private(pixmap);
if (priv == NULL)
goto free_pixmap;
@@ -110,14 +110,14 @@ static int intel_dri3_fd_from_pixmap(ScreenPtr screen,
CARD16 *stride,
CARD32 *size)
{
- struct intel_pixmap *priv;
+ struct intel_uxa_pixmap *priv;
int fd;
fd = intel_glamor_fd_from_pixmap(screen, pixmap, stride, size);
if (fd >= 0)
return fd;
- priv = intel_get_pixmap_private(pixmap);
+ priv = intel_uxa_get_pixmap_private(pixmap);
if (!priv)
return -1;
diff --git a/src/uxa/intel_driver.c b/src/uxa/intel_driver.c
index 7877eb5a..c99cfeb6 100644
--- a/src/uxa/intel_driver.c
+++ b/src/uxa/intel_driver.c
@@ -169,6 +169,18 @@ static Bool i830CreateScreenResources(ScreenPtr screen)
return TRUE;
}
+void
+intel_set_pixmap_bo(PixmapPtr pixmap, dri_bo *bo)
+{
+ intel_uxa_set_pixmap_bo(pixmap, bo);
+}
+
+dri_bo *
+intel_get_pixmap_bo(PixmapPtr pixmap)
+{
+ return intel_uxa_get_pixmap_bo(pixmap);
+}
+
static void PreInitCleanup(ScrnInfoPtr scrn)
{
if (!scrn || !scrn->driverPrivate)
@@ -612,29 +624,6 @@ static Bool I830PreInit(ScrnInfoPtr scrn, int flags)
return TRUE;
}
-/**
- * Intialiazes the hardware for the 3D pipeline use in the 2D driver.
- *
- * Some state caching is performed to avoid redundant state emits. This
- * function is also responsible for marking the state as clobbered for DRI
- * clients.
- */
-void IntelEmitInvarientState(ScrnInfoPtr scrn)
-{
- intel_screen_private *intel = intel_get_screen_private(scrn);
-
- /* If we've emitted our state since the last clobber by another client,
- * skip it.
- */
- if (intel->last_3d != LAST_3D_OTHER)
- return;
-
- if (IS_GEN2(intel))
- I830EmitInvarientState(scrn);
- else if IS_GEN3(intel)
- I915EmitInvarientState(scrn);
-}
-
#ifdef INTEL_PIXMAP_SHARING
static void
redisplay_dirty(ScreenPtr screen, PixmapDirtyUpdatePtr dirty)
@@ -660,7 +649,7 @@ redisplay_dirty(ScreenPtr screen, PixmapDirtyUpdatePtr dirty)
intel_batch_submit(scrn);
if (!intel->has_prime_vmap_flush) {
- drm_intel_bo *bo = intel_get_pixmap_bo(dirty->slave_dst->master_pixmap);
+ drm_intel_bo *bo = intel_uxa_get_pixmap_bo(dirty->slave_dst->master_pixmap);
was_blocked = xf86BlockSIGIO();
drm_intel_bo_map(bo, FALSE);
drm_intel_bo_unmap(bo);
@@ -1002,7 +991,7 @@ I830ScreenInit(SCREEN_INIT_ARGS_DECL)
#endif
/* Init video */
if (intel->XvEnabled)
- I830InitVideo(screen);
+ intel_video_init(screen);
#if HAVE_DRI2
switch (intel->dri2) {
diff --git a/src/uxa/intel_glamor.c b/src/uxa/intel_glamor.c
index fdc65787..1e2cf828 100644
--- a/src/uxa/intel_glamor.c
+++ b/src/uxa/intel_glamor.c
@@ -186,12 +186,12 @@ intel_glamor_create_textured_pixmap(PixmapPtr pixmap)
{
ScrnInfoPtr scrn = xf86ScreenToScrn(pixmap->drawable.pScreen);
intel_screen_private *intel = intel_get_screen_private(scrn);
- struct intel_pixmap *priv;
+ struct intel_uxa_pixmap *priv;
if ((intel->uxa_flags & UXA_USE_GLAMOR) == 0)
return TRUE;
- priv = intel_get_pixmap_private(pixmap);
+ priv = intel_uxa_get_pixmap_private(pixmap);
if (glamor_egl_create_textured_pixmap(pixmap, priv->bo->handle,
intel_pixmap_pitch(pixmap))) {
drm_intel_bo_disable_reuse(priv->bo);
diff --git a/src/uxa/intel_uxa.c b/src/uxa/intel_uxa.c
index e50b2fe5..09358f3b 100644
--- a/src/uxa/intel_uxa.c
+++ b/src/uxa/intel_uxa.c
@@ -131,13 +131,13 @@ gen4_context_switch(intel_screen_private *intel,
}
Bool
-intel_get_aperture_space(ScrnInfoPtr scrn, drm_intel_bo ** bo_table,
+intel_uxa_get_aperture_space(ScrnInfoPtr scrn, drm_intel_bo ** bo_table,
int num_bos)
{
intel_screen_private *intel = intel_get_screen_private(scrn);
if (intel->batch_bo == NULL) {
- intel_debug_fallback(scrn, "VT inactive\n");
+ intel_uxa_debug_fallback(scrn, "VT inactive\n");
return FALSE;
}
@@ -147,7 +147,7 @@ intel_get_aperture_space(ScrnInfoPtr scrn, drm_intel_bo ** bo_table,
bo_table[0] = intel->batch_bo;
if (drm_intel_bufmgr_check_aperture_space(bo_table, num_bos) !=
0) {
- intel_debug_fallback(scrn, "Couldn't get aperture "
+ intel_uxa_debug_fallback(scrn, "Couldn't get aperture "
"space for BOs\n");
return FALSE;
}
@@ -161,7 +161,7 @@ intel_uxa_check_solid(DrawablePtr drawable, int alu, Pixel planemask)
ScrnInfoPtr scrn = xf86ScreenToScrn(drawable->pScreen);
if (!UXA_PM_IS_SOLID(drawable, planemask)) {
- intel_debug_fallback(scrn, "planemask is not solid\n");
+ intel_uxa_debug_fallback(scrn, "planemask is not solid\n");
return FALSE;
}
@@ -187,13 +187,13 @@ intel_uxa_prepare_solid(PixmapPtr pixmap, int alu, Pixel planemask, Pixel fg)
intel_screen_private *intel = intel_get_screen_private(scrn);
drm_intel_bo *bo_table[] = {
NULL, /* batch_bo */
- intel_get_pixmap_bo(pixmap),
+ intel_uxa_get_pixmap_bo(pixmap),
};
- if (!intel_check_pitch_2d(pixmap))
+ if (!intel_uxa_check_pitch_2d(pixmap))
return FALSE;
- if (!intel_get_aperture_space(scrn, bo_table, ARRAY_SIZE(bo_table)))
+ if (!intel_uxa_get_aperture_space(scrn, bo_table, ARRAY_SIZE(bo_table)))
return FALSE;
intel->BR[13] = (I830PatternROP[alu] & 0xff) << 16;
@@ -245,7 +245,7 @@ static void intel_uxa_solid(PixmapPtr pixmap, int x1, int y1, int x2, int y2)
cmd |=
XY_COLOR_BLT_WRITE_ALPHA | XY_COLOR_BLT_WRITE_RGB;
- if (INTEL_INFO(intel)->gen >= 040 && intel_pixmap_tiled(pixmap)) {
+ if (INTEL_INFO(intel)->gen >= 040 && intel_uxa_pixmap_tiled(pixmap)) {
assert((pitch % 512) == 0);
pitch >>= 2;
cmd |= XY_COLOR_BLT_TILED;
@@ -274,12 +274,12 @@ intel_uxa_check_copy(PixmapPtr source, PixmapPtr dest,
ScrnInfoPtr scrn = xf86ScreenToScrn(dest->drawable.pScreen);
if (!UXA_PM_IS_SOLID(&source->drawable, planemask)) {
- intel_debug_fallback(scrn, "planemask is not solid");
+ intel_uxa_debug_fallback(scrn, "planemask is not solid");
return FALSE;
}
if (source->drawable.bitsPerPixel != dest->drawable.bitsPerPixel) {
- intel_debug_fallback(scrn, "mixed bpp copies unsupported\n");
+ intel_uxa_debug_fallback(scrn, "mixed bpp copies unsupported\n");
return FALSE;
}
switch (source->drawable.bitsPerPixel) {
@@ -291,9 +291,9 @@ intel_uxa_check_copy(PixmapPtr source, PixmapPtr dest,
return FALSE;
}
- if (!intel_check_pitch_2d(source))
+ if (!intel_uxa_check_pitch_2d(source))
return FALSE;
- if (!intel_check_pitch_2d(dest))
+ if (!intel_uxa_check_pitch_2d(dest))
return FALSE;
return TRUE;
@@ -307,11 +307,11 @@ intel_uxa_prepare_copy(PixmapPtr source, PixmapPtr dest, int xdir,
intel_screen_private *intel = intel_get_screen_private(scrn);
drm_intel_bo *bo_table[] = {
NULL, /* batch_bo */
- intel_get_pixmap_bo(source),
- intel_get_pixmap_bo(dest),
+ intel_uxa_get_pixmap_bo(source),
+ intel_uxa_get_pixmap_bo(dest),
};
- if (!intel_get_aperture_space(scrn, bo_table, ARRAY_SIZE(bo_table)))
+ if (!intel_uxa_get_aperture_space(scrn, bo_table, ARRAY_SIZE(bo_table)))
return FALSE;
intel->render_source = source;
@@ -386,13 +386,13 @@ intel_uxa_copy(PixmapPtr dest, int src_x1, int src_y1, int dst_x1,
XY_SRC_COPY_BLT_WRITE_RGB;
if (INTEL_INFO(intel)->gen >= 040) {
- if (intel_pixmap_tiled(dest)) {
+ if (intel_uxa_pixmap_tiled(dest)) {
assert((dst_pitch % 512) == 0);
dst_pitch >>= 2;
cmd |= XY_SRC_COPY_BLT_DST_TILED;
}
- if (intel_pixmap_tiled(intel->render_source)) {
+ if (intel_uxa_pixmap_tiled(intel->render_source)) {
assert((src_pitch % 512) == 0);
src_pitch >>= 2;
cmd |= XY_SRC_COPY_BLT_SRC_TILED;
@@ -432,7 +432,7 @@ static void intel_uxa_done(PixmapPtr pixmap)
ADVANCE_BATCH();
}
- intel_debug_flush(scrn);
+ intel_uxa_debug_flush(scrn);
}
/**
@@ -448,7 +448,7 @@ static void i830_done_composite(PixmapPtr dest)
if (intel->vertex_flush)
intel->vertex_flush(intel);
- intel_debug_flush(scrn);
+ intel_uxa_debug_flush(scrn);
}
#define xFixedToFloat(val) \
@@ -476,7 +476,7 @@ _intel_transform_point(PictTransformPtr transform,
* transform may be null.
*/
Bool
-intel_get_transformed_coordinates(int x, int y, PictTransformPtr transform,
+intel_uxa_get_transformed_coordinates(int x, int y, PictTransformPtr transform,
float *x_out, float *y_out)
{
if (transform == NULL) {
@@ -501,7 +501,7 @@ intel_get_transformed_coordinates(int x, int y, PictTransformPtr transform,
* transform may be null.
*/
Bool
-intel_get_transformed_coordinates_3d(int x, int y, PictTransformPtr transform,
+intel_uxa_get_transformed_coordinates_3d(int x, int y, PictTransformPtr transform,
float *x_out, float *y_out, float *w_out)
{
if (transform == NULL) {
@@ -527,18 +527,18 @@ intel_get_transformed_coordinates_3d(int x, int y, PictTransformPtr transform,
*
* transform may be null.
*/
-Bool intel_transform_is_affine(PictTransformPtr t)
+Bool intel_uxa_transform_is_affine(PictTransformPtr t)
{
if (t == NULL)
return TRUE;
return t->matrix[2][0] == 0 && t->matrix[2][1] == 0;
}
-dri_bo *intel_get_pixmap_bo(PixmapPtr pixmap)
+dri_bo *intel_uxa_get_pixmap_bo(PixmapPtr pixmap)
{
- struct intel_pixmap *intel;
+ struct intel_uxa_pixmap *intel;
- intel = intel_get_pixmap_private(pixmap);
+ intel = intel_uxa_get_pixmap_private(pixmap);
if (intel == NULL)
return NULL;
@@ -562,13 +562,13 @@ static unsigned intel_get_tile_width(intel_screen_private *intel, int tiling, in
return tile_width;
}
-void intel_set_pixmap_bo(PixmapPtr pixmap, dri_bo * bo)
+void intel_uxa_set_pixmap_bo(PixmapPtr pixmap, dri_bo * bo)
{
ScrnInfoPtr scrn = xf86ScreenToScrn(pixmap->drawable.pScreen);
intel_screen_private *intel = intel_get_screen_private(scrn);
- struct intel_pixmap *priv;
+ struct intel_uxa_pixmap *priv;
- priv = intel_get_pixmap_private(pixmap);
+ priv = intel_uxa_get_pixmap_private(pixmap);
if (priv == NULL && bo == NULL)
return;
@@ -589,7 +589,7 @@ free_priv:
unsigned tile_width;
int size, stride;
- priv = calloc(1, sizeof (struct intel_pixmap));
+ priv = calloc(1, sizeof (struct intel_uxa_pixmap));
if (priv == NULL)
goto BAIL;
@@ -646,19 +646,14 @@ free_priv:
}
BAIL:
- intel_set_pixmap_private(pixmap, priv);
-}
-
-static Bool intel_uxa_pixmap_is_offscreen(PixmapPtr pixmap)
-{
- return intel_pixmap_is_offscreen(pixmap);
+ intel_uxa_set_pixmap_private(pixmap, priv);
}
static Bool intel_uxa_prepare_access(PixmapPtr pixmap, uxa_access_t access)
{
ScrnInfoPtr scrn = xf86ScreenToScrn(pixmap->drawable.pScreen);
intel_screen_private *intel = intel_get_screen_private(scrn);
- struct intel_pixmap *priv = intel_get_pixmap_private(pixmap);
+ struct intel_uxa_pixmap *priv = intel_uxa_get_pixmap_private(pixmap);
dri_bo *bo = priv->bo;
int ret;
@@ -695,12 +690,12 @@ static Bool intel_uxa_prepare_access(PixmapPtr pixmap, uxa_access_t access)
static void intel_uxa_finish_access(PixmapPtr pixmap, uxa_access_t access)
{
- struct intel_pixmap *priv;
+ struct intel_uxa_pixmap *priv;
if (access == UXA_GLAMOR_ACCESS_RW || access == UXA_GLAMOR_ACCESS_RO)
return;
- priv = intel_get_pixmap_private(pixmap);
+ priv = intel_uxa_get_pixmap_private(pixmap);
if (priv == NULL)
return;
@@ -712,7 +707,7 @@ static Bool intel_uxa_pixmap_put_image(PixmapPtr pixmap,
char *src, int src_pitch,
int x, int y, int w, int h)
{
- struct intel_pixmap *priv = intel_get_pixmap_private(pixmap);
+ struct intel_uxa_pixmap *priv = intel_uxa_get_pixmap_private(pixmap);
int stride = intel_pixmap_pitch(pixmap);
int cpp = pixmap->drawable.bitsPerPixel/8;
int ret = FALSE;
@@ -747,10 +742,10 @@ static Bool intel_uxa_put_image(PixmapPtr pixmap,
int w, int h,
char *src, int src_pitch)
{
- struct intel_pixmap *priv;
+ struct intel_uxa_pixmap *priv;
- priv = intel_get_pixmap_private(pixmap);
- if (!intel_pixmap_is_busy(priv)) {
+ priv = intel_uxa_get_pixmap_private(pixmap);
+ if (!intel_uxa_pixmap_is_busy(priv)) {
/* bo is not busy so can be replaced without a stall, upload in-place. */
return intel_uxa_pixmap_put_image(pixmap, src, src_pitch, x, y, w, h);
} else {
@@ -786,7 +781,7 @@ static Bool intel_uxa_put_image(PixmapPtr pixmap,
w, h,
0, 0,
stride, NULL);
- intel_set_pixmap_bo(pixmap, bo);
+ intel_uxa_set_pixmap_bo(pixmap, bo);
dri_bo_unreference(bo);
return intel_uxa_pixmap_put_image(pixmap, src, src_pitch, 0, 0, w, h);
@@ -833,7 +828,7 @@ static Bool intel_uxa_pixmap_get_image(PixmapPtr pixmap,
int x, int y, int w, int h,
char *dst, int dst_pitch)
{
- struct intel_pixmap *priv = intel_get_pixmap_private(pixmap);
+ struct intel_uxa_pixmap *priv = intel_uxa_get_pixmap_private(pixmap);
int stride = intel_pixmap_pitch(pixmap);
int cpp = pixmap->drawable.bitsPerPixel/8;
@@ -865,7 +860,7 @@ static Bool intel_uxa_get_image(PixmapPtr pixmap,
int w, int h,
char *dst, int dst_pitch)
{
- struct intel_pixmap *priv;
+ struct intel_uxa_pixmap *priv;
PixmapPtr scratch = NULL;
Bool ret;
@@ -876,8 +871,8 @@ static Bool intel_uxa_get_image(PixmapPtr pixmap,
* Also the gpu is much faster at detiling.
*/
- priv = intel_get_pixmap_private(pixmap);
- if (intel_pixmap_is_busy(priv) || priv->tiling != I915_TILING_NONE) {
+ priv = intel_uxa_get_pixmap_private(pixmap);
+ if (intel_uxa_pixmap_is_busy(priv) || priv->tiling != I915_TILING_NONE) {
ScreenPtr screen = pixmap->drawable.pScreen;
GCPtr gc;
@@ -979,7 +974,7 @@ intel_uxa_create_pixmap(ScreenPtr screen, int w, int h, int depth,
{
ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
intel_screen_private *intel = intel_get_screen_private(scrn);
- struct intel_pixmap *priv;
+ struct intel_uxa_pixmap *priv;
PixmapPtr pixmap, new_pixmap = NULL;
if (!(usage & INTEL_CREATE_PIXMAP_DRI2)) {
@@ -1040,7 +1035,7 @@ intel_uxa_create_pixmap(ScreenPtr screen, int w, int h, int depth,
if (size > intel->max_bo_size || stride >= KB(32))
goto fallback_pixmap;
- priv = calloc(1, sizeof (struct intel_pixmap));
+ priv = calloc(1, sizeof (struct intel_uxa_pixmap));
if (priv == NULL)
goto fallback_pixmap;
@@ -1063,7 +1058,7 @@ intel_uxa_create_pixmap(ScreenPtr screen, int w, int h, int depth,
priv->offscreen = 1;
list_init(&priv->batch);
- intel_set_pixmap_private(pixmap, priv);
+ intel_uxa_set_pixmap_private(pixmap, priv);
screen->ModifyPixmapHeader(pixmap, w, h, 0, 0, stride, NULL);
@@ -1109,7 +1104,7 @@ static Bool intel_uxa_destroy_pixmap(PixmapPtr pixmap)
{
if (pixmap->refcnt == 1) {
intel_glamor_destroy_pixmap(pixmap);
- intel_set_pixmap_bo(pixmap, NULL);
+ intel_uxa_set_pixmap_bo(pixmap, NULL);
}
fbDestroyPixmap(pixmap);
return TRUE;
@@ -1142,14 +1137,14 @@ Bool intel_uxa_create_screen_resources(ScreenPtr screen)
NULL))
return FALSE;
- intel_set_pixmap_bo(pixmap, bo);
- if (intel_get_pixmap_private(pixmap) == NULL)
+ intel_uxa_set_pixmap_bo(pixmap, bo);
+ if (intel_uxa_get_pixmap_private(pixmap) == NULL)
goto err;
if (!intel_glamor_create_screen_resources(screen))
goto err;
- intel_get_pixmap_private(pixmap)->pinned |= PIN_SCANOUT;
+ intel_uxa_get_pixmap_private(pixmap)->pinned |= PIN_SCANOUT;
scrn->displayWidth = intel->front_pitch / intel->cpp;
return TRUE;
@@ -1166,9 +1161,9 @@ intel_uxa_share_pixmap_backing(PixmapPtr ppix, ScreenPtr slave, void **fd_handle
{
ScrnInfoPtr scrn = xf86ScreenToScrn(ppix->drawable.pScreen);
intel_screen_private *intel = intel_get_screen_private(scrn);
- struct intel_pixmap *priv = intel_get_pixmap_private(ppix);
+ struct intel_uxa_pixmap *priv = intel_uxa_get_pixmap_private(ppix);
unsigned int size, tiling, swizzle;
- dri_bo *bo = intel_get_pixmap_bo(ppix), *newbo;
+ dri_bo *bo = intel_uxa_get_pixmap_bo(ppix), *newbo;
int stride;
int handle;
@@ -1195,7 +1190,7 @@ intel_uxa_share_pixmap_backing(PixmapPtr ppix, ScreenPtr slave, void **fd_handle
if (tiling != I915_TILING_NONE)
drm_intel_bo_set_tiling(newbo, &tiling, stride);
priv->tiling = tiling;
- intel_set_pixmap_bo(ppix, newbo);
+ intel_uxa_set_pixmap_bo(ppix, newbo);
ppix->drawable.pScreen->ModifyPixmapHeader(ppix, ppix->drawable.width,
ppix->drawable.height, 0, 0,
@@ -1223,7 +1218,7 @@ intel_uxa_set_shared_pixmap_backing(PixmapPtr ppix, void *fd_handle)
if (!bo)
return FALSE;
- intel_set_pixmap_bo(ppix, bo);
+ intel_uxa_set_pixmap_bo(ppix, bo);
close(ihandle);
return TRUE;
}
@@ -1303,6 +1298,29 @@ static Bool intel_option_accel_blt(intel_screen_private *intel)
return strcasecmp(s, "blt") == 0;
}
+/**
+ * Intialiazes the hardware for the 3D pipeline use in the 2D driver.
+ *
+ * Some state caching is performed to avoid redundant state emits. This
+ * function is also responsible for marking the state as clobbered for DRI
+ * clients.
+ */
+void IntelEmitInvarientState(ScrnInfoPtr scrn)
+{
+ intel_screen_private *intel = intel_get_screen_private(scrn);
+
+ /* If we've emitted our state since the last clobber by another client,
+ * skip it.
+ */
+ if (intel->last_3d != LAST_3D_OTHER)
+ return;
+
+ if (IS_GEN2(intel))
+ I830EmitInvarientState(scrn);
+ else if IS_GEN3(intel)
+ I915EmitInvarientState(scrn);
+}
+
Bool intel_uxa_init(ScreenPtr screen)
{
ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
diff --git a/src/uxa/intel_uxa.h b/src/uxa/intel_uxa.h
new file mode 100644
index 00000000..539e12b4
--- /dev/null
+++ b/src/uxa/intel_uxa.h
@@ -0,0 +1,299 @@
+/*
+ * Copyright © 2014 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that copyright
+ * notice and this permission notice appear in supporting documentation, and
+ * that the name of the copyright holders not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission. The copyright holders make no representations
+ * about the suitability of this software for any purpose. It is provided "as
+ * is" without express or implied warranty.
+ *
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#ifndef _INTEL_UXA_H_
+#define _INTEL_UXA_H_
+
+#include "intel_video.h"
+
+struct intel_uxa_pixmap {
+ dri_bo *bo;
+
+ struct list batch;
+
+ uint8_t tiling;
+ int8_t busy :2;
+ uint8_t dirty :1;
+ uint8_t offscreen :1;
+ uint8_t pinned :5;
+#define PIN_SCANOUT 0x1
+#define PIN_DRI2 0x2
+#define PIN_DRI3 0x4
+#define PIN_PRIME 0x8
+#define PIN_GLAMOR 0x10
+};
+
+#if HAS_DEVPRIVATEKEYREC
+extern DevPrivateKeyRec uxa_pixmap_index;
+#else
+extern int uxa_pixmap_index;
+#endif
+
+static inline struct intel_uxa_pixmap *intel_uxa_get_pixmap_private(PixmapPtr pixmap)
+{
+#if HAS_DEVPRIVATEKEYREC
+ return dixGetPrivate(&pixmap->devPrivates, &uxa_pixmap_index);
+#else
+ return dixLookupPrivate(&pixmap->devPrivates, &uxa_pixmap_index);
+#endif
+}
+
+static inline Bool intel_uxa_pixmap_is_busy(struct intel_uxa_pixmap *priv)
+{
+ if (priv->busy == -1)
+ priv->busy = drm_intel_bo_busy(priv->bo);
+ return priv->busy;
+}
+
+static inline void intel_uxa_set_pixmap_private(PixmapPtr pixmap, struct intel_uxa_pixmap *intel)
+{
+ dixSetPrivate(&pixmap->devPrivates, &uxa_pixmap_index, intel);
+}
+
+static inline Bool intel_uxa_pixmap_is_dirty(PixmapPtr pixmap)
+{
+ return pixmap && intel_uxa_get_pixmap_private(pixmap)->dirty;
+}
+
+static inline Bool intel_uxa_pixmap_tiled(PixmapPtr pixmap)
+{
+ return intel_uxa_get_pixmap_private(pixmap)->tiling != I915_TILING_NONE;
+}
+
+dri_bo *intel_uxa_get_pixmap_bo(PixmapPtr pixmap);
+void intel_uxa_set_pixmap_bo(PixmapPtr pixmap, dri_bo * bo);
+
+Bool intel_uxa_init(ScreenPtr pScreen);
+Bool intel_uxa_create_screen_resources(ScreenPtr pScreen);
+void intel_uxa_block_handler(intel_screen_private *intel);
+
+static inline Bool intel_uxa_pixmap_is_offscreen(PixmapPtr pixmap)
+{
+ struct intel_uxa_pixmap *priv = intel_uxa_get_pixmap_private(pixmap);
+ return priv && priv->offscreen;
+}
+
+/* Batchbuffer support macros and functions */
+#include "intel_batchbuffer.h"
+
+/* I830 specific functions */
+extern void IntelEmitInvarientState(ScrnInfoPtr scrn);
+extern void I830EmitInvarientState(ScrnInfoPtr scrn);
+extern void I915EmitInvarientState(ScrnInfoPtr scrn);
+
+extern void I830EmitFlush(ScrnInfoPtr scrn);
+
+/* i830_render.c */
+Bool i830_check_composite(int op,
+ PicturePtr sourcec, PicturePtr mask, PicturePtr dest,
+ int width, int height);
+Bool i830_check_composite_target(PixmapPtr pixmap);
+Bool i830_check_composite_texture(ScreenPtr screen, PicturePtr picture);
+Bool i830_prepare_composite(int op, PicturePtr sourcec, PicturePtr mask,
+ PicturePtr dest, PixmapPtr sourcecPixmap,
+ PixmapPtr maskPixmap, PixmapPtr destPixmap);
+void i830_composite(PixmapPtr dest, int srcX, int srcY,
+ int maskX, int maskY, int dstX, int dstY, int w, int h);
+void i830_vertex_flush(intel_screen_private *intel);
+
+/* i915_render.c */
+Bool i915_check_composite(int op,
+ PicturePtr sourcec, PicturePtr mask, PicturePtr dest,
+ int width, int height);
+Bool i915_check_composite_target(PixmapPtr pixmap);
+Bool i915_check_composite_texture(ScreenPtr screen, PicturePtr picture);
+Bool i915_prepare_composite(int op, PicturePtr sourcec, PicturePtr mask,
+ PicturePtr dest, PixmapPtr sourcecPixmap,
+ PixmapPtr maskPixmap, PixmapPtr destPixmap);
+void i915_composite(PixmapPtr dest, int srcX, int srcY,
+ int maskX, int maskY, int dstX, int dstY, int w, int h);
+void i915_vertex_flush(intel_screen_private *intel);
+void i915_batch_commit_notify(intel_screen_private *intel);
+void i830_batch_commit_notify(intel_screen_private *intel);
+/* i965_render.c */
+unsigned int gen4_render_state_size(ScrnInfoPtr scrn);
+void gen4_render_state_init(ScrnInfoPtr scrn);
+void gen4_render_state_cleanup(ScrnInfoPtr scrn);
+Bool i965_check_composite(int op,
+ PicturePtr sourcec, PicturePtr mask, PicturePtr dest,
+ int width, int height);
+Bool i965_check_composite_texture(ScreenPtr screen, PicturePtr picture);
+Bool i965_prepare_composite(int op, PicturePtr sourcec, PicturePtr mask,
+ PicturePtr dest, PixmapPtr sourcecPixmap,
+ PixmapPtr maskPixmap, PixmapPtr destPixmap);
+void i965_composite(PixmapPtr dest, int srcX, int srcY,
+ int maskX, int maskY, int dstX, int dstY, int w, int h);
+
+void i965_vertex_flush(intel_screen_private *intel);
+void i965_batch_flush(intel_screen_private *intel);
+void i965_batch_commit_notify(intel_screen_private *intel);
+
+/* i965_3d.c */
+void gen6_upload_invariant_states(intel_screen_private *intel);
+void gen6_upload_viewport_state_pointers(intel_screen_private *intel,
+ drm_intel_bo *cc_vp_bo);
+void gen7_upload_viewport_state_pointers(intel_screen_private *intel,
+ drm_intel_bo *cc_vp_bo);
+void gen6_upload_urb(intel_screen_private *intel);
+void gen7_upload_urb(intel_screen_private *intel);
+void gen6_upload_cc_state_pointers(intel_screen_private *intel,
+ drm_intel_bo *blend_bo, drm_intel_bo *cc_bo,
+ drm_intel_bo *depth_stencil_bo,
+ uint32_t blend_offset);
+void gen7_upload_cc_state_pointers(intel_screen_private *intel,
+ drm_intel_bo *blend_bo, drm_intel_bo *cc_bo,
+ drm_intel_bo *depth_stencil_bo,
+ uint32_t blend_offset);
+void gen6_upload_sampler_state_pointers(intel_screen_private *intel,
+ drm_intel_bo *sampler_bo);
+void gen7_upload_sampler_state_pointers(intel_screen_private *intel,
+ drm_intel_bo *sampler_bo);
+void gen7_upload_bypass_states(intel_screen_private *intel);
+void gen6_upload_gs_state(intel_screen_private *intel);
+void gen6_upload_vs_state(intel_screen_private *intel);
+void gen6_upload_clip_state(intel_screen_private *intel);
+void gen6_upload_sf_state(intel_screen_private *intel, int num_sf_outputs, int read_offset);
+void gen7_upload_sf_state(intel_screen_private *intel, int num_sf_outputs, int read_offset);
+void gen6_upload_binding_table(intel_screen_private *intel, uint32_t ps_binding_table_offset);
+void gen7_upload_binding_table(intel_screen_private *intel, uint32_t ps_binding_table_offset);
+void gen6_upload_depth_buffer_state(intel_screen_private *intel);
+void gen7_upload_depth_buffer_state(intel_screen_private *intel);
+
+Bool intel_uxa_transform_is_affine(PictTransformPtr t);
+
+Bool
+intel_uxa_get_transformed_coordinates(int x, int y, PictTransformPtr transform,
+ float *x_out, float *y_out);
+
+Bool
+intel_uxa_get_transformed_coordinates_3d(int x, int y, PictTransformPtr transform,
+ float *x_out, float *y_out, float *z_out);
+
+static inline void
+intel_uxa_debug_fallback(ScrnInfoPtr scrn, const char *format, ...) _X_ATTRIBUTE_PRINTF(2, 3);
+
+static inline void
+intel_uxa_debug_fallback(ScrnInfoPtr scrn, const char *format, ...)
+{
+ intel_screen_private *intel = intel_get_screen_private(scrn);
+ va_list ap;
+
+ va_start(ap, format);
+ if (intel->fallback_debug) {
+ xf86DrvMsg(scrn->scrnIndex, X_INFO, "fallback: ");
+ LogVMessageVerb(X_INFO, 1, format, ap);
+ }
+ va_end(ap);
+}
+
+static inline Bool
+intel_uxa_check_pitch_2d(PixmapPtr pixmap)
+{
+ uint32_t pitch = intel_pixmap_pitch(pixmap);
+ if (pitch > KB(32)) {
+ ScrnInfoPtr scrn = xf86ScreenToScrn(pixmap->drawable.pScreen);
+ intel_uxa_debug_fallback(scrn, "pitch exceeds 2d limit 32K\n");
+ return FALSE;
+ }
+ return TRUE;
+}
+
+/* For pre-965 chip only, as they have 8KB limit for 3D */
+static inline Bool
+intel_uxa_check_pitch_3d(PixmapPtr pixmap)
+{
+ uint32_t pitch = intel_pixmap_pitch(pixmap);
+ if (pitch > KB(8)) {
+ ScrnInfoPtr scrn = xf86ScreenToScrn(pixmap->drawable.pScreen);
+ intel_uxa_debug_fallback(scrn, "pitch exceeds 3d limit 8K\n");
+ return FALSE;
+ }
+ return TRUE;
+}
+
+/**
+ * Little wrapper around drm_intel_bo_reloc to return the initial value you
+ * should stuff into the relocation entry.
+ *
+ * If only we'd done this before settling on the library API.
+ */
+static inline uint32_t
+intel_uxa_emit_reloc(drm_intel_bo * bo, uint32_t offset,
+ drm_intel_bo * target_bo, uint32_t target_offset,
+ uint32_t read_domains, uint32_t write_domain)
+{
+ drm_intel_bo_emit_reloc(bo, offset, target_bo, target_offset,
+ read_domains, write_domain);
+
+ return target_bo->offset + target_offset;
+}
+
+static inline drm_intel_bo *intel_uxa_bo_alloc_for_data(intel_screen_private *intel,
+ const void *data,
+ unsigned int size,
+ const char *name)
+{
+ drm_intel_bo *bo;
+ int ret;
+
+ bo = drm_intel_bo_alloc(intel->bufmgr, name, size, 4096);
+ assert(bo);
+
+ ret = drm_intel_bo_subdata(bo, 0, size, data);
+ assert(ret == 0);
+
+ return bo;
+ (void)ret;
+}
+
+void intel_uxa_debug_flush(ScrnInfoPtr scrn);
+
+
+Bool intel_uxa_get_aperture_space(ScrnInfoPtr scrn, drm_intel_bo ** bo_table,
+ int num_bos);
+
+XF86VideoAdaptorPtr intel_uxa_video_setup_image_textured(ScreenPtr screen);
+
+void I915DisplayVideoTextured(ScrnInfoPtr scrn,
+ intel_adaptor_private *adaptor_priv,
+ int id, RegionPtr dstRegion, short width,
+ short height, int video_pitch, int video_pitch2,
+ short src_w, short src_h,
+ short drw_w, short drw_h, PixmapPtr pixmap);
+
+void I965DisplayVideoTextured(ScrnInfoPtr scrn,
+ intel_adaptor_private *adaptor_priv,
+ int id, RegionPtr dstRegion, short width,
+ short height, int video_pitch, int video_pitch2,
+ short src_w, short src_h,
+ short drw_w, short drw_h, PixmapPtr pixmap);
+
+void Gen6DisplayVideoTextured(ScrnInfoPtr scrn,
+ intel_adaptor_private *adaptor_priv,
+ int id, RegionPtr dstRegion, short width,
+ short height, int video_pitch, int video_pitch2,
+ short src_w, short src_h,
+ short drw_w, short drw_h, PixmapPtr pixmap);
+
+void i965_free_video(ScrnInfoPtr scrn);
+
+#endif /* _INTEL_UXA_H_ */
diff --git a/src/uxa/intel_uxa_video.c b/src/uxa/intel_uxa_video.c
new file mode 100644
index 00000000..7ff909ff
--- /dev/null
+++ b/src/uxa/intel_uxa_video.c
@@ -0,0 +1,389 @@
+/***************************************************************************
+
+ Copyright 2000 Intel Corporation. All Rights Reserved.
+
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sub license, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice (including the
+ next paragraph) shall be included in all copies or substantial portions
+ of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+ IN NO EVENT SHALL INTEL, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
+ THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ **************************************************************************/
+
+/*
+ * i830_video.c: i830/i845 Xv driver.
+ *
+ * Copyright © 2002 by Alan Hourihane and David Dawes
+ *
+ * Authors:
+ * Alan Hourihane <alanh@tungstengraphics.com>
+ * David Dawes <dawes@xfree86.org>
+ *
+ * Derived from i810 Xv driver:
+ *
+ * Authors of i810 code:
+ * Jonathan Bian <jonathan.bian@intel.com>
+ * Offscreen Images:
+ * Matt Sottek <matthew.j.sottek@intel.com>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <inttypes.h>
+#include <math.h>
+#include <string.h>
+#include <assert.h>
+#include <errno.h>
+
+#include "xorg-server.h"
+#include "xf86.h"
+#include "xf86_OSproc.h"
+#include "compiler.h"
+#include "xf86Pci.h"
+#include "xf86fbman.h"
+#include "xf86drm.h"
+#include "regionstr.h"
+#include "randrstr.h"
+#include "windowstr.h"
+#include "damage.h"
+#include "intel.h"
+#include "intel_video.h"
+#include "i830_reg.h"
+#include "xf86xv.h"
+#include <X11/extensions/Xv.h>
+#include "dixstruct.h"
+#include "fourcc.h"
+
+#ifdef INTEL_XVMC
+#define _INTEL_XVMC_SERVER_
+#include "intel_xvmc.h"
+#endif
+#include "intel_glamor.h"
+
+/* overlay debugging printf function */
+#if 0
+#define UXA_VIDEO_DEBUG ErrorF
+#else
+#define UXA_VIDEO_DEBUG if (0) ErrorF
+#endif
+
+static int intel_uxa_video_put_image_textured(ScrnInfoPtr, short, short, short, short, short, short,
+ short, short, int, unsigned char *, short, short,
+ Bool, RegionPtr, pointer, DrawablePtr);
+
+static int
+intel_uxa_video_set_port_attribute(ScrnInfoPtr scrn,
+ Atom attribute, INT32 value, pointer data)
+{
+ intel_adaptor_private *adaptor_priv = (intel_adaptor_private *) data;
+
+ if (attribute == intel_xv_Brightness) {
+ if ((value < -128) || (value > 127))
+ return BadValue;
+ adaptor_priv->brightness = value;
+ return Success;
+ } else if (attribute == intel_xv_Contrast) {
+ if ((value < 0) || (value > 255))
+ return BadValue;
+ adaptor_priv->contrast = value;
+ return Success;
+ } else if (attribute == intel_xv_SyncToVblank) {
+ if ((value < -1) || (value > 1))
+ return BadValue;
+ adaptor_priv->SyncToVblank = value;
+ return Success;
+ } else {
+ return BadMatch;
+ }
+}
+
+
+static int xvmc_passthrough(int id)
+{
+#ifdef INTEL_XVMC
+ return id == FOURCC_XVMC;
+#else
+ return 0;
+#endif
+}
+
+
+static void
+intel_wait_for_scanline(ScrnInfoPtr scrn, PixmapPtr pixmap,
+ xf86CrtcPtr crtc, RegionPtr clipBoxes)
+{
+ intel_screen_private *intel = intel_get_screen_private(scrn);
+ pixman_box16_t box, crtc_box;
+ int pipe, event;
+ Bool full_height;
+ int y1, y2;
+
+ pipe = -1;
+ if (scrn->vtSema && pixmap_is_scanout(pixmap))
+ pipe = intel_crtc_to_pipe(crtc);
+ if (pipe < 0)
+ return;
+
+ box = *REGION_EXTENTS(unused, clipBoxes);
+
+ if (crtc->transform_in_use)
+ pixman_f_transform_bounds(&crtc->f_framebuffer_to_crtc, &box);
+
+ /* We could presume the clip was correctly computed... */
+ intel_crtc_box(crtc, &crtc_box);
+ intel_box_intersect(&box, &crtc_box, &box);
+
+ /*
+ * Make sure we don't wait for a scanline that will
+ * never occur
+ */
+ y1 = (crtc_box.y1 <= box.y1) ? box.y1 - crtc_box.y1 : 0;
+ y2 = (box.y2 <= crtc_box.y2) ?
+ box.y2 - crtc_box.y1 : crtc_box.y2 - crtc_box.y1;
+ if (y2 <= y1)
+ return;
+
+ full_height = FALSE;
+ if (y1 == 0 && y2 == (crtc_box.y2 - crtc_box.y1))
+ full_height = TRUE;
+
+ /*
+ * Pre-965 doesn't have SVBLANK, so we need a bit
+ * of extra time for the blitter to start up and
+ * do its job for a full height blit
+ */
+ if (full_height && INTEL_INFO(intel)->gen < 040)
+ y2 -= 2;
+
+ if (pipe == 0) {
+ pipe = MI_LOAD_SCAN_LINES_DISPLAY_PIPEA;
+ event = MI_WAIT_FOR_PIPEA_SCAN_LINE_WINDOW;
+ if (full_height && INTEL_INFO(intel)->gen >= 040)
+ event = MI_WAIT_FOR_PIPEA_SVBLANK;
+ } else {
+ pipe = MI_LOAD_SCAN_LINES_DISPLAY_PIPEB;
+ event = MI_WAIT_FOR_PIPEB_SCAN_LINE_WINDOW;
+ if (full_height && INTEL_INFO(intel)->gen >= 040)
+ event = MI_WAIT_FOR_PIPEB_SVBLANK;
+ }
+
+ if (crtc->mode.Flags & V_INTERLACE) {
+ /* DSL count field lines */
+ y1 /= 2;
+ y2 /= 2;
+ }
+
+ BEGIN_BATCH(5);
+ /* The documentation says that the LOAD_SCAN_LINES command
+ * always comes in pairs. Don't ask me why. */
+ OUT_BATCH(MI_LOAD_SCAN_LINES_INCL | pipe);
+ OUT_BATCH((y1 << 16) | (y2-1));
+ OUT_BATCH(MI_LOAD_SCAN_LINES_INCL | pipe);
+ OUT_BATCH((y1 << 16) | (y2-1));
+ OUT_BATCH(MI_WAIT_FOR_EVENT | event);
+ ADVANCE_BATCH();
+}
+
+/*
+ * The source rectangle of the video is defined by (src_x, src_y, src_w, src_h).
+ * The dest rectangle of the video is defined by (drw_x, drw_y, drw_w, drw_h).
+ * id is a fourcc code for the format of the video.
+ * buf is the pointer to the source data in system memory.
+ * width and height are the w/h of the source data.
+ * If "sync" is TRUE, then we must be finished with *buf at the point of return
+ * (which we always are).
+ * clipBoxes is the clipping region in screen space.
+ * data is a pointer to our port private.
+ * drawable is some Drawable, which might not be the screen in the case of
+ * compositing. It's a new argument to the function in the 1.1 server.
+ */
+static int
+intel_uxa_video_put_image_textured(ScrnInfoPtr scrn,
+ short src_x, short src_y,
+ short drw_x, short drw_y,
+ short src_w, short src_h,
+ short drw_w, short drw_h,
+ int id, unsigned char *buf,
+ short width, short height,
+ Bool sync, RegionPtr clipBoxes, pointer data,
+ DrawablePtr drawable)
+{
+ intel_screen_private *intel = intel_get_screen_private(scrn);
+ intel_adaptor_private *adaptor_priv = (intel_adaptor_private *) data;
+ PixmapPtr pixmap = get_drawable_pixmap(drawable);
+ int dstPitch, dstPitch2;
+ BoxRec dstBox;
+ xf86CrtcPtr crtc;
+ int top, left, npixels, nlines;
+
+ if (!intel_uxa_pixmap_is_offscreen(pixmap))
+ return BadAlloc;
+
+#if 0
+ ErrorF("I830PutImage: src: (%d,%d)(%d,%d), dst: (%d,%d)(%d,%d)\n"
+ "width %d, height %d\n", src_x, src_y, src_w, src_h, drw_x,
+ drw_y, drw_w, drw_h, width, height);
+#endif
+
+ if (!intel_clip_video_helper(scrn,
+ adaptor_priv,
+ &crtc,
+ &dstBox,
+ src_x, src_y, drw_x, drw_y,
+ src_w, src_h, drw_w, drw_h,
+ id,
+ &top, &left, &npixels, &nlines, clipBoxes,
+ width, height))
+ return Success;
+
+ if (xvmc_passthrough(id)) {
+ uint32_t *gem_handle = (uint32_t *)buf;
+ int size;
+
+ intel_setup_dst_params(scrn, adaptor_priv, width, height,
+ &dstPitch, &dstPitch2, &size, id);
+
+ if (IS_I915G(intel) || IS_I915GM(intel)) {
+ /* XXX: i915 is not support and needs some
+ * serious care. grep for KMS in i915_hwmc.c */
+ return BadAlloc;
+ }
+
+ if (adaptor_priv->buf)
+ drm_intel_bo_unreference(adaptor_priv->buf);
+
+ adaptor_priv->buf =
+ drm_intel_bo_gem_create_from_name(intel->bufmgr,
+ "xvmc surface",
+ *gem_handle);
+ if (adaptor_priv->buf == NULL)
+ return BadAlloc;
+
+ adaptor_priv->reusable = FALSE;
+ } else {
+ if (!intel_video_copy_data(scrn, adaptor_priv, width, height,
+ &dstPitch, &dstPitch2,
+ top, left, npixels, nlines, id, buf))
+ return BadAlloc;
+ }
+
+ if (crtc && adaptor_priv->SyncToVblank != 0 && INTEL_INFO(intel)->gen < 060) {
+ intel_wait_for_scanline(scrn, pixmap, crtc, clipBoxes);
+ }
+
+ if (INTEL_INFO(intel)->gen >= 060) {
+ Gen6DisplayVideoTextured(scrn, adaptor_priv, id, clipBoxes,
+ width, height, dstPitch, dstPitch2,
+ src_w, src_h,
+ drw_w, drw_h, pixmap);
+ } else if (INTEL_INFO(intel)->gen >= 040) {
+ I965DisplayVideoTextured(scrn, adaptor_priv, id, clipBoxes,
+ width, height, dstPitch, dstPitch2,
+ src_w, src_h,
+ drw_w, drw_h, pixmap);
+ } else {
+ I915DisplayVideoTextured(scrn, adaptor_priv, id, clipBoxes,
+ width, height, dstPitch, dstPitch2,
+ src_w, src_h, drw_w, drw_h,
+ pixmap);
+ }
+
+ intel_get_screen_private(scrn)->needs_flush = TRUE;
+ DamageDamageRegion(drawable, clipBoxes);
+
+ /* And make sure the WAIT_FOR_EVENT is queued before any
+ * modesetting/dpms operations on the pipe.
+ */
+ intel_batch_submit(scrn);
+
+ return Success;
+}
+
+XF86VideoAdaptorPtr intel_uxa_video_setup_image_textured(ScreenPtr screen)
+{
+ ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
+ intel_screen_private *intel = intel_get_screen_private(scrn);
+ XF86VideoAdaptorPtr adapt;
+ intel_adaptor_private *adaptor_privs;
+ DevUnion *devUnions;
+ int nports = 16, i;
+
+ UXA_VIDEO_DEBUG("intel_video_overlay_setup_image\n");
+
+ adapt = calloc(1, sizeof(XF86VideoAdaptorRec));
+ adaptor_privs = calloc(nports, sizeof(intel_adaptor_private));
+ devUnions = calloc(nports, sizeof(DevUnion));
+ if (adapt == NULL || adaptor_privs == NULL || devUnions == NULL) {
+ free(adapt);
+ free(adaptor_privs);
+ free(devUnions);
+ return NULL;
+ }
+
+ adapt->type = XvWindowMask | XvInputMask | XvImageMask;
+ adapt->flags = 0;
+ adapt->name = "Intel(R) Textured Video";
+ adapt->nEncodings = 1;
+ adapt->pEncodings = xnfalloc(sizeof(intel_xv_dummy_encoding));
+ memcpy(adapt->pEncodings, intel_xv_dummy_encoding, sizeof(intel_xv_dummy_encoding));
+ adapt->nFormats = NUM_FORMATS;
+ adapt->pFormats = intel_xv_formats;
+ adapt->nPorts = nports;
+ adapt->pPortPrivates = devUnions;
+ adapt->nAttributes = 0;
+ adapt->pAttributes = NULL;
+ if (IS_I915G(intel) || IS_I915GM(intel))
+ adapt->nImages = NUM_IMAGES - XVMC_IMAGE;
+ else
+ adapt->nImages = NUM_IMAGES;
+
+ adapt->pImages = intel_xv_images;
+ adapt->PutVideo = NULL;
+ adapt->PutStill = NULL;
+ adapt->GetVideo = NULL;
+ adapt->GetStill = NULL;
+ adapt->StopVideo = intel_video_stop_video;
+ adapt->SetPortAttribute = intel_uxa_video_set_port_attribute;
+ adapt->GetPortAttribute = intel_video_get_port_attribute;
+ adapt->QueryBestSize = intel_video_query_best_size;
+ adapt->PutImage = intel_uxa_video_put_image_textured;
+ adapt->QueryImageAttributes = intel_video_query_image_attributes;
+
+ for (i = 0; i < nports; i++) {
+ intel_adaptor_private *adaptor_priv = &adaptor_privs[i];
+
+ adaptor_priv->textured = TRUE;
+ adaptor_priv->videoStatus = 0;
+ adaptor_priv->buf = NULL;
+ adaptor_priv->old_buf[0] = NULL;
+ adaptor_priv->old_buf[1] = NULL;
+
+ adaptor_priv->rotation = RR_Rotate_0;
+ adaptor_priv->SyncToVblank = 1;
+
+ /* gotta uninit this someplace, XXX: shouldn't be necessary for textured */
+ REGION_NULL(screen, &adaptor_priv->clip);
+
+ adapt->pPortPrivates[i].ptr = (pointer) (adaptor_priv);
+ }
+
+ intel_xv_SyncToVblank = MAKE_ATOM("XV_SYNC_TO_VBLANK");
+
+ return adapt;
+}
diff --git a/src/uxa/intel_video.c b/src/uxa/intel_video.c
index 73fb6112..310b6c9f 100644
--- a/src/uxa/intel_video.c
+++ b/src/uxa/intel_video.c
@@ -1,35 +1,35 @@
/***************************************************************************
- Copyright 2000 Intel Corporation. All Rights Reserved.
-
- Permission is hereby granted, free of charge, to any person obtaining a
- copy of this software and associated documentation files (the
- "Software"), to deal in the Software without restriction, including
- without limitation the rights to use, copy, modify, merge, publish,
- distribute, sub license, and/or sell copies of the Software, and to
- permit persons to whom the Software is furnished to do so, subject to
- the following conditions:
-
- The above copyright notice and this permission notice (including the
- next paragraph) shall be included in all copies or substantial portions
- of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- IN NO EVENT SHALL INTEL, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
+ Copyright 2000 Intel Corporation. All Rights Reserved.
+
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sub license, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice (including the
+ next paragraph) shall be included in all copies or substantial portions
+ of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+ IN NO EVENT SHALL INTEL, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
THE USE OR OTHER DEALINGS IN THE SOFTWARE.
**************************************************************************/
/*
- * i830_video.c: i830/i845 Xv driver.
+ * i830_video.c: i830/i845 Xv driver.
*
* Copyright © 2002 by Alan Hourihane and David Dawes
*
- * Authors:
+ * Authors:
* Alan Hourihane <alanh@tungstengraphics.com>
* David Dawes <dawes@xfree86.org>
*
@@ -79,55 +79,15 @@
#include "intel_xvmc.h"
#endif
#include "intel_glamor.h"
+#include "intel_uxa.h"
+#include "intel_video_overlay.h"
-#define OFF_DELAY 250 /* milliseconds */
-
-#define OFF_TIMER 0x01
-#define CLIENT_VIDEO_ON 0x02
-
-static XF86VideoAdaptorPtr I830SetupImageVideoOverlay(ScreenPtr);
-static XF86VideoAdaptorPtr I830SetupImageVideoTextured(ScreenPtr);
-static void I830StopVideo(ScrnInfoPtr, pointer, Bool);
-static int I830SetPortAttributeOverlay(ScrnInfoPtr, Atom, INT32, pointer);
-static int I830SetPortAttributeTextured(ScrnInfoPtr, Atom, INT32, pointer);
-static int I830GetPortAttribute(ScrnInfoPtr, Atom, INT32 *, pointer);
-static void I830QueryBestSize(ScrnInfoPtr, Bool,
- short, short, short, short, unsigned int *,
- unsigned int *, pointer);
-static int I830PutImageTextured(ScrnInfoPtr, short, short, short, short, short, short,
- short, short, int, unsigned char *, short, short,
- Bool, RegionPtr, pointer, DrawablePtr);
-static int I830PutImageOverlay(ScrnInfoPtr, short, short, short, short, short, short,
- short, short, int, unsigned char *, short, short,
- Bool, RegionPtr, pointer, DrawablePtr);
-static int I830QueryImageAttributes(ScrnInfoPtr, int, unsigned short *,
- unsigned short *, int *, int *);
-
-#define MAKE_ATOM(a) MakeAtom(a, sizeof(a) - 1, TRUE)
-
-static Atom xvBrightness, xvContrast, xvSaturation, xvColorKey, xvPipe;
-static Atom xvGamma0, xvGamma1, xvGamma2, xvGamma3, xvGamma4, xvGamma5;
-static Atom xvSyncToVblank;
-
-/* Limits for the overlay/textured video source sizes. The documented hardware
- * limits are 2048x2048 or better for overlay and both of our textured video
- * implementations. Additionally, on the 830 and 845, larger sizes resulted in
- * the card hanging, so we keep the limits lower there.
- */
-#define IMAGE_MAX_WIDTH 2048
-#define IMAGE_MAX_HEIGHT 2048
-#define IMAGE_MAX_WIDTH_LEGACY 1024
-#define IMAGE_MAX_HEIGHT_LEGACY 1088
-
-/* overlay debugging printf function */
-#if 0
-#define OVERLAY_DEBUG ErrorF
-#else
-#define OVERLAY_DEBUG if (0) ErrorF
-#endif
+Atom intel_xv_Brightness, intel_xv_Contrast, intel_xv_Saturation, intel_xv_ColorKey, intel_xv_Pipe;
+Atom intel_xv_Gamma0, intel_xv_Gamma1, intel_xv_Gamma2, intel_xv_Gamma3, intel_xv_Gamma4, intel_xv_Gamma5;
+Atom intel_xv_SyncToVblank;
/* client libraries expect an encoding */
-static const XF86VideoEncodingRec DummyEncoding[1] = {
+const XF86VideoEncodingRec intel_xv_dummy_encoding[1] = {
{
0,
"XV_IMAGE",
@@ -136,14 +96,11 @@ static const XF86VideoEncodingRec DummyEncoding[1] = {
}
};
-#define NUM_FORMATS 3
-
-static XF86VideoFormatRec Formats[NUM_FORMATS] = {
+XF86VideoFormatRec intel_xv_formats[NUM_FORMATS] = {
{15, TrueColor}, {16, TrueColor}, {24, TrueColor}
};
-#define NUM_ATTRIBUTES 5
-static XF86AttributeRec Attributes[NUM_ATTRIBUTES] = {
+XF86AttributeRec intel_xv_attributes[NUM_ATTRIBUTES] = {
{XvSettable | XvGettable, 0, (1 << 24) - 1, "XV_COLORKEY"},
{XvSettable | XvGettable, -128, 127, "XV_BRIGHTNESS"},
{XvSettable | XvGettable, 0, 255, "XV_CONTRAST"},
@@ -152,7 +109,7 @@ static XF86AttributeRec Attributes[NUM_ATTRIBUTES] = {
};
#define GAMMA_ATTRIBUTES 6
-static XF86AttributeRec GammaAttributes[GAMMA_ATTRIBUTES] = {
+XF86AttributeRec intel_xv_gamma_attributes[GAMMA_ATTRIBUTES] = {
{XvSettable | XvGettable, 0, 0xffffff, "XV_GAMMA0"},
{XvSettable | XvGettable, 0, 0xffffff, "XV_GAMMA1"},
{XvSettable | XvGettable, 0, 0xffffff, "XV_GAMMA2"},
@@ -169,7 +126,7 @@ static XF86AttributeRec GammaAttributes[GAMMA_ATTRIBUTES] = {
#define XVMC_IMAGE 0
#endif
-static XF86ImageRec Images[NUM_IMAGES] = {
+XF86ImageRec intel_xv_images[NUM_IMAGES] = {
XVIMAGE_YUY2,
XVIMAGE_YV12,
XVIMAGE_I420,
@@ -201,144 +158,20 @@ static XF86ImageRec Images[NUM_IMAGES] = {
#endif
};
-/* kernel modesetting overlay functions */
-static Bool intel_has_overlay(intel_screen_private *intel)
-{
- struct drm_i915_getparam gp;
- int has_overlay = 0;
- int ret;
-
- gp.param = I915_PARAM_HAS_OVERLAY;
- gp.value = &has_overlay;
- ret = drmCommandWriteRead(intel->drmSubFD, DRM_I915_GETPARAM, &gp, sizeof(gp));
-
- return ret == 0 && !! has_overlay;
-}
-
-static Bool intel_overlay_update_attrs(intel_screen_private *intel)
-{
- intel_adaptor_private *adaptor_priv = intel_get_adaptor_private(intel);
- struct drm_intel_overlay_attrs attrs;
-
- attrs.flags = I915_OVERLAY_UPDATE_ATTRS;
- attrs.brightness = adaptor_priv->brightness;
- attrs.contrast = adaptor_priv->contrast;
- attrs.saturation = adaptor_priv->saturation;
- attrs.color_key = adaptor_priv->colorKey;
- attrs.gamma0 = adaptor_priv->gamma0;
- attrs.gamma1 = adaptor_priv->gamma1;
- attrs.gamma2 = adaptor_priv->gamma2;
- attrs.gamma3 = adaptor_priv->gamma3;
- attrs.gamma4 = adaptor_priv->gamma4;
- attrs.gamma5 = adaptor_priv->gamma5;
-
- return drmCommandWriteRead(intel->drmSubFD, DRM_I915_OVERLAY_ATTRS,
- &attrs, sizeof(attrs)) == 0;
-}
-
-static void intel_overlay_off(intel_screen_private *intel)
-{
- struct drm_intel_overlay_put_image request;
- int ret;
-
- request.flags = 0;
-
- ret = drmCommandWrite(intel->drmSubFD, DRM_I915_OVERLAY_PUT_IMAGE,
- &request, sizeof(request));
- (void) ret;
-}
-
-static Bool
-intel_overlay_put_image(intel_screen_private *intel,
- xf86CrtcPtr crtc,
- int id, short width, short height,
- int dstPitch, int dstPitch2,
- BoxPtr dstBox, short src_w, short src_h, short drw_w,
- short drw_h)
-{
- intel_adaptor_private *adaptor_priv = intel_get_adaptor_private(intel);
- struct drm_intel_overlay_put_image request;
- int ret;
- int planar = is_planar_fourcc(id);
- float scale;
- dri_bo *tmp;
-
- request.flags = I915_OVERLAY_ENABLE;
-
- request.bo_handle = adaptor_priv->buf->handle;
- if (planar) {
- request.stride_Y = dstPitch2;
- request.stride_UV = dstPitch;
- } else {
- request.stride_Y = dstPitch;
- request.stride_UV = 0;
- }
- request.offset_Y = adaptor_priv->YBufOffset;
- request.offset_U = adaptor_priv->UBufOffset;
- request.offset_V = adaptor_priv->VBufOffset;
- OVERLAY_DEBUG("off_Y: %i, off_U: %i, off_V: %i\n", request.offset_Y,
- request.offset_U, request.offset_V);
-
- request.crtc_id = intel_crtc_id(crtc);
- request.dst_x = dstBox->x1;
- request.dst_y = dstBox->y1;
- request.dst_width = dstBox->x2 - dstBox->x1;
- request.dst_height = dstBox->y2 - dstBox->y1;
-
- request.src_width = width;
- request.src_height = height;
- /* adjust src dimensions */
- if (request.dst_height > 1) {
- scale = ((float)request.dst_height - 1) / ((float)drw_h - 1);
- request.src_scan_height = src_h * scale;
- } else
- request.src_scan_height = 1;
-
- if (request.dst_width > 1) {
- scale = ((float)request.dst_width - 1) / ((float)drw_w - 1);
- request.src_scan_width = src_w * scale;
- } else
- request.src_scan_width = 1;
-
- if (planar) {
- request.flags |= I915_OVERLAY_YUV_PLANAR | I915_OVERLAY_YUV420;
- } else {
- request.flags |= I915_OVERLAY_YUV_PACKED | I915_OVERLAY_YUV422;
- if (id == FOURCC_UYVY)
- request.flags |= I915_OVERLAY_Y_SWAP;
- }
-
- ret = drmCommandWrite(intel->drmSubFD, DRM_I915_OVERLAY_PUT_IMAGE,
- &request, sizeof(request));
- if (ret)
- return FALSE;
-
- if (!adaptor_priv->reusable) {
- drm_intel_bo_unreference(adaptor_priv->buf);
- adaptor_priv->buf = NULL;
- adaptor_priv->reusable = TRUE;
- }
-
- tmp = adaptor_priv->old_buf[1];
- adaptor_priv->old_buf[1] = adaptor_priv->old_buf[0];
- adaptor_priv->old_buf[0] = adaptor_priv->buf;
- adaptor_priv->buf = tmp;
-
- return TRUE;
-}
-
-void I830InitVideo(ScreenPtr screen)
+void intel_video_init(ScreenPtr screen)
{
ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
intel_screen_private *intel = intel_get_screen_private(scrn);
XF86VideoAdaptorPtr *adaptors = NULL, *newAdaptors = NULL;
XF86VideoAdaptorPtr overlayAdaptor = NULL, texturedAdaptor = NULL, glamorAdaptor = NULL;
int num_adaptors = xf86XVListGenericAdaptors(scrn, &adaptors);
+
/* Give our adaptor list enough space for the overlay and/or texture video
* adaptors.
*/
newAdaptors = realloc(adaptors,
(num_adaptors + 3) * sizeof(XF86VideoAdaptorPtr));
+
if (newAdaptors == NULL) {
free(adaptors);
return;
@@ -348,30 +181,29 @@ void I830InitVideo(ScreenPtr screen)
/* Add the adaptors supported by our hardware. First, set up the atoms
* that will be used by both output adaptors.
*/
- xvBrightness = MAKE_ATOM("XV_BRIGHTNESS");
- xvContrast = MAKE_ATOM("XV_CONTRAST");
-
- /* Set up textured video if we can do it at this depth and we are on
- * supported hardware.
- */
- if (!intel->force_fallback &&
- scrn->bitsPerPixel >= 16 &&
- INTEL_INFO(intel)->gen >= 030 &&
- INTEL_INFO(intel)->gen < 0100) {
- texturedAdaptor = I830SetupImageVideoTextured(screen);
- if (texturedAdaptor != NULL) {
- xf86DrvMsg(scrn->scrnIndex, X_INFO,
- "Set up textured video\n");
- } else {
- xf86DrvMsg(scrn->scrnIndex, X_ERROR,
- "Failed to set up textured video\n");
- }
- }
-
- /* Set up overlay video if it is available */
- intel->use_overlay = intel_has_overlay(intel);
- if (intel->use_overlay) {
- overlayAdaptor = I830SetupImageVideoOverlay(screen);
+ intel_xv_Brightness = MAKE_ATOM("XV_BRIGHTNESS");
+ intel_xv_Contrast = MAKE_ATOM("XV_CONTRAST");
+
+ /* Set up textured video if we can do it at this depth and we are on
+ * supported hardware.
+ */
+ if (!intel->force_fallback &&
+ scrn->bitsPerPixel >= 16 &&
+ INTEL_INFO(intel)->gen >= 030 &&
+ INTEL_INFO(intel)->gen < 0100) {
+ texturedAdaptor = intel_uxa_video_setup_image_textured(screen);
+ if (texturedAdaptor != NULL) {
+ xf86DrvMsg(scrn->scrnIndex, X_INFO,
+ "Set up textured video\n");
+ } else {
+ xf86DrvMsg(scrn->scrnIndex, X_ERROR,
+ "Failed to set up textured video\n");
+ }
+ }
+
+ overlayAdaptor = intel_video_overlay_setup_image(screen);
+
+ if (intel->use_overlay) {
if (overlayAdaptor != NULL) {
xf86DrvMsg(scrn->scrnIndex, X_INFO,
"Set up overlay video\n");
@@ -386,6 +218,7 @@ void I830InitVideo(ScreenPtr screen)
xf86DrvMsg(scrn->scrnIndex, X_INFO,
"Set up textured video using glamor\n");
+
if (overlayAdaptor && intel->XvPreferOverlay)
adaptors[num_adaptors++] = overlayAdaptor;
@@ -406,195 +239,13 @@ void I830InitVideo(ScreenPtr screen)
intel->XvEnabled = FALSE;
}
-#ifdef INTEL_XVMC
- if (texturedAdaptor)
- intel_xvmc_adaptor_init(screen);
-#endif
- free(adaptors);
-}
+ if (texturedAdaptor)
+ intel_xvmc_adaptor_init(screen);
-static XF86VideoAdaptorPtr I830SetupImageVideoOverlay(ScreenPtr screen)
-{
- ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
- intel_screen_private *intel = intel_get_screen_private(scrn);
- XF86VideoAdaptorPtr adapt;
- intel_adaptor_private *adaptor_priv;
- XF86AttributePtr att;
-
- OVERLAY_DEBUG("I830SetupImageVideoOverlay\n");
-
- if (!(adapt = calloc(1,
- sizeof(XF86VideoAdaptorRec) +
- sizeof(intel_adaptor_private) +
- sizeof(DevUnion))))
- return NULL;
-
- adapt->type = XvWindowMask | XvInputMask | XvImageMask;
- adapt->flags = VIDEO_OVERLAID_IMAGES /*| VIDEO_CLIP_TO_VIEWPORT */ ;
- adapt->name = "Intel(R) Video Overlay";
- adapt->nEncodings = 1;
- adapt->pEncodings = xnfalloc(sizeof(DummyEncoding));
- memcpy(adapt->pEncodings, DummyEncoding, sizeof(DummyEncoding));
- if (IS_845G(intel) || IS_I830(intel)) {
- adapt->pEncodings->width = IMAGE_MAX_WIDTH_LEGACY;
- adapt->pEncodings->height = IMAGE_MAX_HEIGHT_LEGACY;
- }
- adapt->nFormats = NUM_FORMATS;
- adapt->pFormats = Formats;
- adapt->nPorts = 1;
- adapt->pPortPrivates = (DevUnion *) (&adapt[1]);
-
- adaptor_priv = (intel_adaptor_private *)&adapt->pPortPrivates[1];
-
- adapt->pPortPrivates[0].ptr = (pointer) (adaptor_priv);
- adapt->nAttributes = NUM_ATTRIBUTES;
- if (INTEL_INFO(intel)->gen >= 030)
- adapt->nAttributes += GAMMA_ATTRIBUTES; /* has gamma */
- adapt->pAttributes =
- xnfalloc(sizeof(XF86AttributeRec) * adapt->nAttributes);
- /* Now copy the attributes */
- att = adapt->pAttributes;
- memcpy((char *)att, (char *)Attributes,
- sizeof(XF86AttributeRec) * NUM_ATTRIBUTES);
- att += NUM_ATTRIBUTES;
- if (INTEL_INFO(intel)->gen >= 030) {
- memcpy((char *)att, (char *)GammaAttributes,
- sizeof(XF86AttributeRec) * GAMMA_ATTRIBUTES);
- }
- adapt->nImages = NUM_IMAGES - XVMC_IMAGE;
-
- adapt->pImages = Images;
- adapt->PutVideo = NULL;
- adapt->PutStill = NULL;
- adapt->GetVideo = NULL;
- adapt->GetStill = NULL;
- adapt->StopVideo = I830StopVideo;
- adapt->SetPortAttribute = I830SetPortAttributeOverlay;
- adapt->GetPortAttribute = I830GetPortAttribute;
- adapt->QueryBestSize = I830QueryBestSize;
- adapt->PutImage = I830PutImageOverlay;
- adapt->QueryImageAttributes = I830QueryImageAttributes;
-
- adaptor_priv->textured = FALSE;
- adaptor_priv->colorKey = intel->colorKey & ((1 << scrn->depth) - 1);
- adaptor_priv->videoStatus = 0;
- adaptor_priv->brightness = -19; /* (255/219) * -16 */
- adaptor_priv->contrast = 75; /* 255/219 * 64 */
- adaptor_priv->saturation = 146; /* 128/112 * 128 */
- adaptor_priv->desired_crtc = NULL;
- adaptor_priv->buf = NULL;
- adaptor_priv->old_buf[0] = NULL;
- adaptor_priv->old_buf[1] = NULL;
- adaptor_priv->gamma5 = 0xc0c0c0;
- adaptor_priv->gamma4 = 0x808080;
- adaptor_priv->gamma3 = 0x404040;
- adaptor_priv->gamma2 = 0x202020;
- adaptor_priv->gamma1 = 0x101010;
- adaptor_priv->gamma0 = 0x080808;
-
- adaptor_priv->rotation = RR_Rotate_0;
-
- /* gotta uninit this someplace */
- REGION_NULL(screen, &adaptor_priv->clip);
-
- intel->adaptor = adapt;
-
- xvColorKey = MAKE_ATOM("XV_COLORKEY");
- xvBrightness = MAKE_ATOM("XV_BRIGHTNESS");
- xvContrast = MAKE_ATOM("XV_CONTRAST");
- xvSaturation = MAKE_ATOM("XV_SATURATION");
-
- /* Allow the pipe to be switched from pipe A to B when in clone mode */
- xvPipe = MAKE_ATOM("XV_PIPE");
-
- if (INTEL_INFO(intel)->gen >= 030) {
- xvGamma0 = MAKE_ATOM("XV_GAMMA0");
- xvGamma1 = MAKE_ATOM("XV_GAMMA1");
- xvGamma2 = MAKE_ATOM("XV_GAMMA2");
- xvGamma3 = MAKE_ATOM("XV_GAMMA3");
- xvGamma4 = MAKE_ATOM("XV_GAMMA4");
- xvGamma5 = MAKE_ATOM("XV_GAMMA5");
- }
-
- intel_overlay_update_attrs(intel);
-
- return adapt;
-}
-
-static XF86VideoAdaptorPtr I830SetupImageVideoTextured(ScreenPtr screen)
-{
- ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
- intel_screen_private *intel = intel_get_screen_private(scrn);
- XF86VideoAdaptorPtr adapt;
- intel_adaptor_private *adaptor_privs;
- DevUnion *devUnions;
- int nports = 16, i;
-
- OVERLAY_DEBUG("I830SetupImageVideoOverlay\n");
-
- adapt = calloc(1, sizeof(XF86VideoAdaptorRec));
- adaptor_privs = calloc(nports, sizeof(intel_adaptor_private));
- devUnions = calloc(nports, sizeof(DevUnion));
- if (adapt == NULL || adaptor_privs == NULL || devUnions == NULL) {
- free(adapt);
- free(adaptor_privs);
- free(devUnions);
- return NULL;
- }
-
- adapt->type = XvWindowMask | XvInputMask | XvImageMask;
- adapt->flags = 0;
- adapt->name = "Intel(R) Textured Video";
- adapt->nEncodings = 1;
- adapt->pEncodings = xnfalloc(sizeof(DummyEncoding));
- memcpy(adapt->pEncodings, DummyEncoding, sizeof(DummyEncoding));
- adapt->nFormats = NUM_FORMATS;
- adapt->pFormats = Formats;
- adapt->nPorts = nports;
- adapt->pPortPrivates = devUnions;
- adapt->nAttributes = 0;
- adapt->pAttributes = NULL;
- if (IS_I915G(intel) || IS_I915GM(intel))
- adapt->nImages = NUM_IMAGES - XVMC_IMAGE;
- else
- adapt->nImages = NUM_IMAGES;
-
- adapt->pImages = Images;
- adapt->PutVideo = NULL;
- adapt->PutStill = NULL;
- adapt->GetVideo = NULL;
- adapt->GetStill = NULL;
- adapt->StopVideo = I830StopVideo;
- adapt->SetPortAttribute = I830SetPortAttributeTextured;
- adapt->GetPortAttribute = I830GetPortAttribute;
- adapt->QueryBestSize = I830QueryBestSize;
- adapt->PutImage = I830PutImageTextured;
- adapt->QueryImageAttributes = I830QueryImageAttributes;
-
- for (i = 0; i < nports; i++) {
- intel_adaptor_private *adaptor_priv = &adaptor_privs[i];
-
- adaptor_priv->textured = TRUE;
- adaptor_priv->videoStatus = 0;
- adaptor_priv->buf = NULL;
- adaptor_priv->old_buf[0] = NULL;
- adaptor_priv->old_buf[1] = NULL;
-
- adaptor_priv->rotation = RR_Rotate_0;
- adaptor_priv->SyncToVblank = 1;
-
- /* gotta uninit this someplace, XXX: shouldn't be necessary for textured */
- REGION_NULL(screen, &adaptor_priv->clip);
-
- adapt->pPortPrivates[i].ptr = (pointer) (adaptor_priv);
- }
-
- xvSyncToVblank = MAKE_ATOM("XV_SYNC_TO_VBLANK");
-
- return adapt;
+ free(adaptors);
}
-static void intel_free_video_buffers(intel_adaptor_private *adaptor_priv)
+void intel_free_video_buffers(intel_adaptor_private *adaptor_priv)
{
int i;
@@ -612,137 +263,20 @@ static void intel_free_video_buffers(intel_adaptor_private *adaptor_priv)
}
}
-static void I830StopVideo(ScrnInfoPtr scrn, pointer data, Bool shutdown)
-{
- intel_adaptor_private *adaptor_priv = (intel_adaptor_private *) data;
-
- if (adaptor_priv->textured)
- return;
-
- OVERLAY_DEBUG("I830StopVideo\n");
-
- REGION_EMPTY(scrn->pScreen, &adaptor_priv->clip);
-
- if (shutdown) {
- if (adaptor_priv->videoStatus & CLIENT_VIDEO_ON)
- intel_overlay_off(intel_get_screen_private(scrn));
-
- intel_free_video_buffers(adaptor_priv);
- adaptor_priv->videoStatus = 0;
- } else {
- if (adaptor_priv->videoStatus & CLIENT_VIDEO_ON) {
- adaptor_priv->videoStatus |= OFF_TIMER;
- adaptor_priv->offTime = currentTime.milliseconds + OFF_DELAY;
- }
- }
-
-}
-
-static int
-I830SetPortAttributeTextured(ScrnInfoPtr scrn,
- Atom attribute, INT32 value, pointer data)
-{
- intel_adaptor_private *adaptor_priv = (intel_adaptor_private *) data;
-
- if (attribute == xvBrightness) {
- if ((value < -128) || (value > 127))
- return BadValue;
- adaptor_priv->brightness = value;
- return Success;
- } else if (attribute == xvContrast) {
- if ((value < 0) || (value > 255))
- return BadValue;
- adaptor_priv->contrast = value;
- return Success;
- } else if (attribute == xvSyncToVblank) {
- if ((value < -1) || (value > 1))
- return BadValue;
- adaptor_priv->SyncToVblank = value;
- return Success;
- } else {
- return BadMatch;
- }
-}
-
-static int
-I830SetPortAttributeOverlay(ScrnInfoPtr scrn,
- Atom attribute, INT32 value, pointer data)
-{
- intel_adaptor_private *adaptor_priv = (intel_adaptor_private *) data;
- intel_screen_private *intel = intel_get_screen_private(scrn);
-
- if (attribute == xvBrightness) {
- if ((value < -128) || (value > 127))
- return BadValue;
- adaptor_priv->brightness = value;
- OVERLAY_DEBUG("BRIGHTNESS\n");
- } else if (attribute == xvContrast) {
- if ((value < 0) || (value > 255))
- return BadValue;
- adaptor_priv->contrast = value;
- OVERLAY_DEBUG("CONTRAST\n");
- } else if (attribute == xvSaturation) {
- if ((value < 0) || (value > 1023))
- return BadValue;
- adaptor_priv->saturation = value;
- } else if (attribute == xvPipe) {
- xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
- if ((value < -1) || (value >= xf86_config->num_crtc))
- return BadValue;
- if (value < 0)
- adaptor_priv->desired_crtc = NULL;
- else
- adaptor_priv->desired_crtc = xf86_config->crtc[value];
- } else if (attribute == xvGamma0 && (INTEL_INFO(intel)->gen >= 030)) {
- adaptor_priv->gamma0 = value;
- } else if (attribute == xvGamma1 && (INTEL_INFO(intel)->gen >= 030)) {
- adaptor_priv->gamma1 = value;
- } else if (attribute == xvGamma2 && (INTEL_INFO(intel)->gen >= 030)) {
- adaptor_priv->gamma2 = value;
- } else if (attribute == xvGamma3 && (INTEL_INFO(intel)->gen >= 030)) {
- adaptor_priv->gamma3 = value;
- } else if (attribute == xvGamma4 && (INTEL_INFO(intel)->gen >= 030)) {
- adaptor_priv->gamma4 = value;
- } else if (attribute == xvGamma5 && (INTEL_INFO(intel)->gen >= 030)) {
- adaptor_priv->gamma5 = value;
- } else if (attribute == xvColorKey) {
- adaptor_priv->colorKey = value;
- OVERLAY_DEBUG("COLORKEY\n");
- } else
- return BadMatch;
-
- if ((attribute == xvGamma0 ||
- attribute == xvGamma1 ||
- attribute == xvGamma2 ||
- attribute == xvGamma3 ||
- attribute == xvGamma4 ||
- attribute == xvGamma5) && (INTEL_INFO(intel)->gen >= 030)) {
- OVERLAY_DEBUG("GAMMA\n");
- }
-
- if (!intel_overlay_update_attrs(intel))
- return BadValue;
-
- if (attribute == xvColorKey)
- REGION_EMPTY(scrn->pScreen, &adaptor_priv->clip);
-
- return Success;
-}
-
-static int
-I830GetPortAttribute(ScrnInfoPtr scrn,
- Atom attribute, INT32 * value, pointer data)
+int
+intel_video_get_port_attribute(ScrnInfoPtr scrn,
+ Atom attribute, INT32 * value, pointer data)
{
intel_screen_private *intel = intel_get_screen_private(scrn);
intel_adaptor_private *adaptor_priv = (intel_adaptor_private *) data;
- if (attribute == xvBrightness) {
+ if (attribute == intel_xv_Brightness) {
*value = adaptor_priv->brightness;
- } else if (attribute == xvContrast) {
+ } else if (attribute == intel_xv_Contrast) {
*value = adaptor_priv->contrast;
- } else if (attribute == xvSaturation) {
+ } else if (attribute == intel_xv_Saturation) {
*value = adaptor_priv->saturation;
- } else if (attribute == xvPipe) {
+ } else if (attribute == intel_xv_Pipe) {
int c;
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
for (c = 0; c < xf86_config->num_crtc; c++)
@@ -751,21 +285,21 @@ I830GetPortAttribute(ScrnInfoPtr scrn,
if (c == xf86_config->num_crtc)
c = -1;
*value = c;
- } else if (attribute == xvGamma0 && (INTEL_INFO(intel)->gen >= 030)) {
+ } else if (attribute == intel_xv_Gamma0 && (INTEL_INFO(intel)->gen >= 030)) {
*value = adaptor_priv->gamma0;
- } else if (attribute == xvGamma1 && (INTEL_INFO(intel)->gen >= 030)) {
+ } else if (attribute == intel_xv_Gamma1 && (INTEL_INFO(intel)->gen >= 030)) {
*value = adaptor_priv->gamma1;
- } else if (attribute == xvGamma2 && (INTEL_INFO(intel)->gen >= 030)) {
+ } else if (attribute == intel_xv_Gamma2 && (INTEL_INFO(intel)->gen >= 030)) {
*value = adaptor_priv->gamma2;
- } else if (attribute == xvGamma3 && (INTEL_INFO(intel)->gen >= 030)) {
+ } else if (attribute == intel_xv_Gamma3 && (INTEL_INFO(intel)->gen >= 030)) {
*value = adaptor_priv->gamma3;
- } else if (attribute == xvGamma4 && (INTEL_INFO(intel)->gen >= 030)) {
+ } else if (attribute == intel_xv_Gamma4 && (INTEL_INFO(intel)->gen >= 030)) {
*value = adaptor_priv->gamma4;
- } else if (attribute == xvGamma5 && (INTEL_INFO(intel)->gen >= 030)) {
+ } else if (attribute == intel_xv_Gamma5 && (INTEL_INFO(intel)->gen >= 030)) {
*value = adaptor_priv->gamma5;
- } else if (attribute == xvColorKey) {
+ } else if (attribute == intel_xv_ColorKey) {
*value = adaptor_priv->colorKey;
- } else if (attribute == xvSyncToVblank) {
+ } else if (attribute == intel_xv_SyncToVblank) {
*value = adaptor_priv->SyncToVblank;
} else
return BadMatch;
@@ -773,8 +307,8 @@ I830GetPortAttribute(ScrnInfoPtr scrn,
return Success;
}
-static void
-I830QueryBestSize(ScrnInfoPtr scrn,
+void
+intel_video_query_best_size(ScrnInfoPtr scrn,
Bool motion,
short vid_w, short vid_h,
short drw_w, short drw_h,
@@ -790,16 +324,16 @@ I830QueryBestSize(ScrnInfoPtr scrn,
}
static Bool
-I830CopyPackedData(intel_adaptor_private *adaptor_priv,
- unsigned char *buf,
- int srcPitch, int dstPitch, int top, int left, int h, int w)
+intel_video_copy_packed_data(intel_adaptor_private *adaptor_priv,
+ unsigned char *buf,
+ int srcPitch, int dstPitch, int top, int left, int h, int w)
{
unsigned char *src, *dst, *dst_base;
int i, j;
unsigned char *s;
#if 0
- ErrorF("I830CopyPackedData: (%d,%d) (%d,%d)\n"
+ ErrorF("intel_video_copy_packed_data: (%d,%d) (%d,%d)\n"
"srcPitch: %d, dstPitch: %d\n", top, left, h, w,
srcPitch, dstPitch);
#endif
@@ -954,7 +488,7 @@ static void intel_memcpy_plane(unsigned char *dst, unsigned char *src,
}
static Bool
-I830CopyPlanarData(intel_adaptor_private *adaptor_priv,
+intel_video_copy_planar_data(intel_adaptor_private *adaptor_priv,
unsigned char *buf, int srcPitch, int srcPitch2,
int dstPitch, int dstPitch2,
int srcH, int top, int left,
@@ -963,7 +497,7 @@ I830CopyPlanarData(intel_adaptor_private *adaptor_priv,
unsigned char *src1, *src2, *src3, *dst_base, *dst1, *dst2, *dst3;
#if 0
- ErrorF("I830CopyPlanarData: srcPitch %d, srcPitch %d, dstPitch %d\n"
+ ErrorF("intel_video_copy_planar_data: srcPitch %d, srcPitch %d, dstPitch %d\n"
"nlines %d, npixels %d, top %d, left %d\n",
srcPitch, srcPitch2, dstPitch, h, w, top, left);
#endif
@@ -1025,366 +559,7 @@ I830CopyPlanarData(intel_adaptor_private *adaptor_priv,
return TRUE;
}
-static void intel_box_intersect(BoxPtr dest, BoxPtr a, BoxPtr b)
-{
- dest->x1 = a->x1 > b->x1 ? a->x1 : b->x1;
- dest->x2 = a->x2 < b->x2 ? a->x2 : b->x2;
- if (dest->x1 >= dest->x2) {
- dest->x1 = dest->x2 = dest->y1 = dest->y2 = 0;
- return;
- }
-
- dest->y1 = a->y1 > b->y1 ? a->y1 : b->y1;
- dest->y2 = a->y2 < b->y2 ? a->y2 : b->y2;
- if (dest->y1 >= dest->y2)
- dest->x1 = dest->x2 = dest->y1 = dest->y2 = 0;
-}
-
-static void intel_crtc_box(xf86CrtcPtr crtc, BoxPtr crtc_box)
-{
- if (crtc->enabled) {
- crtc_box->x1 = crtc->x;
- crtc_box->x2 =
- crtc->x + xf86ModeWidth(&crtc->mode, crtc->rotation);
- crtc_box->y1 = crtc->y;
- crtc_box->y2 =
- crtc->y + xf86ModeHeight(&crtc->mode, crtc->rotation);
- } else
- crtc_box->x1 = crtc_box->x2 = crtc_box->y1 = crtc_box->y2 = 0;
-}
-
-static int intel_box_area(BoxPtr box)
-{
- return (int)(box->x2 - box->x1) * (int)(box->y2 - box->y1);
-}
-
-/*
- * Return the crtc covering 'box'. If two crtcs cover a portion of
- * 'box', then prefer 'desired'. If 'desired' is NULL, then prefer the crtc
- * with greater coverage
- */
-
-xf86CrtcPtr
-intel_covering_crtc(ScrnInfoPtr scrn,
- BoxPtr box, xf86CrtcPtr desired, BoxPtr crtc_box_ret)
-{
- xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
- xf86CrtcPtr crtc, best_crtc;
- int coverage, best_coverage;
- int c;
- BoxRec crtc_box, cover_box;
-
- best_crtc = NULL;
- best_coverage = 0;
- crtc_box_ret->x1 = 0;
- crtc_box_ret->x2 = 0;
- crtc_box_ret->y1 = 0;
- crtc_box_ret->y2 = 0;
- for (c = 0; c < xf86_config->num_crtc; c++) {
- crtc = xf86_config->crtc[c];
-
- /* If the CRTC is off, treat it as not covering */
- if (!intel_crtc_on(crtc))
- continue;
-
- intel_crtc_box(crtc, &crtc_box);
- intel_box_intersect(&cover_box, &crtc_box, box);
- coverage = intel_box_area(&cover_box);
- if (coverage && crtc == desired) {
- *crtc_box_ret = crtc_box;
- return crtc;
- }
- if (coverage > best_coverage) {
- *crtc_box_ret = crtc_box;
- best_crtc = crtc;
- best_coverage = coverage;
- }
- }
- return best_crtc;
-}
-
-static void
-intel_update_dst_box_to_crtc_coords(ScrnInfoPtr scrn, xf86CrtcPtr crtc,
- BoxPtr dstBox)
-{
- int tmp;
-
- /* for overlay, we should take it from crtc's screen
- * coordinate to current crtc's display mode.
- * yeah, a bit confusing.
- */
- switch (crtc->rotation & 0xf) {
- case RR_Rotate_0:
- dstBox->x1 -= crtc->x;
- dstBox->x2 -= crtc->x;
- dstBox->y1 -= crtc->y;
- dstBox->y2 -= crtc->y;
- break;
- case RR_Rotate_90:
- tmp = dstBox->x1;
- dstBox->x1 = dstBox->y1 - crtc->x;
- dstBox->y1 = scrn->virtualX - tmp - crtc->y;
- tmp = dstBox->x2;
- dstBox->x2 = dstBox->y2 - crtc->x;
- dstBox->y2 = scrn->virtualX - tmp - crtc->y;
- tmp = dstBox->y1;
- dstBox->y1 = dstBox->y2;
- dstBox->y2 = tmp;
- break;
- case RR_Rotate_180:
- tmp = dstBox->x1;
- dstBox->x1 = scrn->virtualX - dstBox->x2 - crtc->x;
- dstBox->x2 = scrn->virtualX - tmp - crtc->x;
- tmp = dstBox->y1;
- dstBox->y1 = scrn->virtualY - dstBox->y2 - crtc->y;
- dstBox->y2 = scrn->virtualY - tmp - crtc->y;
- break;
- case RR_Rotate_270:
- tmp = dstBox->x1;
- dstBox->x1 = scrn->virtualY - dstBox->y1 - crtc->x;
- dstBox->y1 = tmp - crtc->y;
- tmp = dstBox->x2;
- dstBox->x2 = scrn->virtualY - dstBox->y2 - crtc->x;
- dstBox->y2 = tmp - crtc->y;
- tmp = dstBox->x1;
- dstBox->x1 = dstBox->x2;
- dstBox->x2 = tmp;
- break;
- }
-
- return;
-}
-
-int is_planar_fourcc(int id)
-{
- switch (id) {
- case FOURCC_YV12:
- case FOURCC_I420:
-#ifdef INTEL_XVMC
- case FOURCC_XVMC:
-#endif
- return 1;
- case FOURCC_UYVY:
- case FOURCC_YUY2:
- return 0;
- default:
- ErrorF("Unknown format 0x%x\n", id);
- return 0;
- }
-}
-
-static int xvmc_passthrough(int id)
-{
-#ifdef INTEL_XVMC
- return id == FOURCC_XVMC;
-#else
- return 0;
-#endif
-}
-
-static Bool
-intel_display_overlay(ScrnInfoPtr scrn, xf86CrtcPtr crtc,
- int id, short width, short height,
- int dstPitch, int dstPitch2,
- BoxPtr dstBox, short src_w, short src_h, short drw_w,
- short drw_h)
-{
- intel_screen_private *intel = intel_get_screen_private(scrn);
- int tmp;
-
- OVERLAY_DEBUG("I830DisplayVideo: %dx%d (pitch %d)\n", width, height,
- dstPitch);
-
- /*
- * If the video isn't visible on any CRTC, turn it off
- */
- if (!crtc) {
- intel_overlay_off(intel);
- return TRUE;
- }
-
- intel_update_dst_box_to_crtc_coords(scrn, crtc, dstBox);
-
- if (crtc->rotation & (RR_Rotate_90 | RR_Rotate_270)) {
- tmp = width;
- width = height;
- height = tmp;
- tmp = drw_w;
- drw_w = drw_h;
- drw_h = tmp;
- tmp = src_w;
- src_w = src_h;
- src_h = tmp;
- }
-
- return intel_overlay_put_image(intel, crtc, id,
- width, height,
- dstPitch, dstPitch2, dstBox,
- src_w, src_h, drw_w, drw_h);
-}
-
-static Bool
-intel_clip_video_helper(ScrnInfoPtr scrn,
- intel_adaptor_private *adaptor_priv,
- xf86CrtcPtr * crtc_ret,
- BoxPtr dst,
- short src_x, short src_y,
- short drw_x, short drw_y,
- short src_w, short src_h,
- short drw_w, short drw_h,
- int id,
- int *top, int* left, int* npixels, int *nlines,
- RegionPtr reg, INT32 width, INT32 height)
-{
- Bool ret;
- RegionRec crtc_region_local;
- RegionPtr crtc_region = reg;
- BoxRec crtc_box;
- INT32 x1, x2, y1, y2;
- xf86CrtcPtr crtc;
-
- x1 = src_x;
- x2 = src_x + src_w;
- y1 = src_y;
- y2 = src_y + src_h;
-
- dst->x1 = drw_x;
- dst->x2 = drw_x + drw_w;
- dst->y1 = drw_y;
- dst->y2 = drw_y + drw_h;
-
- /*
- * For overlay video, compute the relevant CRTC and
- * clip video to that
- */
- crtc = intel_covering_crtc(scrn, dst, adaptor_priv->desired_crtc,
- &crtc_box);
-
- /* For textured video, we don't actually want to clip at all. */
- if (crtc && !adaptor_priv->textured) {
- REGION_INIT(screen, &crtc_region_local, &crtc_box, 1);
- crtc_region = &crtc_region_local;
- REGION_INTERSECT(screen, crtc_region, crtc_region,
- reg);
- }
- *crtc_ret = crtc;
-
- ret = xf86XVClipVideoHelper(dst, &x1, &x2, &y1, &y2,
- crtc_region, width, height);
- if (crtc_region != reg)
- REGION_UNINIT(screen, &crtc_region_local);
-
- *top = y1 >> 16;
- *left = (x1 >> 16) & ~1;
- *npixels = ALIGN(((x2 + 0xffff) >> 16), 2) - *left;
- if (is_planar_fourcc(id)) {
- *top &= ~1;
- *nlines = ALIGN(((y2 + 0xffff) >> 16), 2) - *top;
- } else
- *nlines = ((y2 + 0xffff) >> 16) - *top;
-
- return ret;
-}
-
-static void
-intel_wait_for_scanline(ScrnInfoPtr scrn, PixmapPtr pixmap,
- xf86CrtcPtr crtc, RegionPtr clipBoxes)
-{
- intel_screen_private *intel = intel_get_screen_private(scrn);
- pixman_box16_t box, crtc_box;
- int pipe, event;
- Bool full_height;
- int y1, y2;
-
- pipe = -1;
- if (scrn->vtSema && pixmap_is_scanout(pixmap))
- pipe = intel_crtc_to_pipe(crtc);
- if (pipe < 0)
- return;
-
- box = *REGION_EXTENTS(unused, clipBoxes);
-
- if (crtc->transform_in_use)
- pixman_f_transform_bounds(&crtc->f_framebuffer_to_crtc, &box);
-
- /* We could presume the clip was correctly computed... */
- intel_crtc_box(crtc, &crtc_box);
- intel_box_intersect(&box, &crtc_box, &box);
-
- /*
- * Make sure we don't wait for a scanline that will
- * never occur
- */
- y1 = (crtc_box.y1 <= box.y1) ? box.y1 - crtc_box.y1 : 0;
- y2 = (box.y2 <= crtc_box.y2) ?
- box.y2 - crtc_box.y1 : crtc_box.y2 - crtc_box.y1;
- if (y2 <= y1)
- return;
-
- full_height = FALSE;
- if (y1 == 0 && y2 == (crtc_box.y2 - crtc_box.y1))
- full_height = TRUE;
-
- /*
- * Pre-965 doesn't have SVBLANK, so we need a bit
- * of extra time for the blitter to start up and
- * do its job for a full height blit
- */
- if (full_height && INTEL_INFO(intel)->gen < 040)
- y2 -= 2;
-
- if (pipe == 0) {
- pipe = MI_LOAD_SCAN_LINES_DISPLAY_PIPEA;
- event = MI_WAIT_FOR_PIPEA_SCAN_LINE_WINDOW;
- if (full_height && INTEL_INFO(intel)->gen >= 040)
- event = MI_WAIT_FOR_PIPEA_SVBLANK;
- } else {
- pipe = MI_LOAD_SCAN_LINES_DISPLAY_PIPEB;
- event = MI_WAIT_FOR_PIPEB_SCAN_LINE_WINDOW;
- if (full_height && INTEL_INFO(intel)->gen >= 040)
- event = MI_WAIT_FOR_PIPEB_SVBLANK;
- }
-
- if (crtc->mode.Flags & V_INTERLACE) {
- /* DSL count field lines */
- y1 /= 2;
- y2 /= 2;
- }
-
- BEGIN_BATCH(5);
- /* The documentation says that the LOAD_SCAN_LINES command
- * always comes in pairs. Don't ask me why. */
- OUT_BATCH(MI_LOAD_SCAN_LINES_INCL | pipe);
- OUT_BATCH((y1 << 16) | (y2-1));
- OUT_BATCH(MI_LOAD_SCAN_LINES_INCL | pipe);
- OUT_BATCH((y1 << 16) | (y2-1));
- OUT_BATCH(MI_WAIT_FOR_EVENT | event);
- ADVANCE_BATCH();
-}
-
-static Bool
-intel_setup_video_buffer(ScrnInfoPtr scrn, intel_adaptor_private *adaptor_priv,
- int alloc_size, int id, unsigned char *buf)
-{
- intel_screen_private *intel = intel_get_screen_private(scrn);
-
- /* Free the current buffer if we're going to have to reallocate */
- if (adaptor_priv->buf && adaptor_priv->buf->size < alloc_size)
- intel_free_video_buffers(adaptor_priv);
-
- if (adaptor_priv->buf == NULL) {
- adaptor_priv->buf = drm_intel_bo_alloc(intel->bufmgr, "xv buffer",
- alloc_size, 4096);
- if (adaptor_priv->buf == NULL)
- return FALSE;
-
- adaptor_priv->reusable = TRUE;
- }
-
- return TRUE;
-}
-
-static void
+void
intel_setup_dst_params(ScrnInfoPtr scrn, intel_adaptor_private *adaptor_priv, short width,
short height, int *dstPitch, int *dstPitch2, int *size,
int id)
@@ -1462,10 +637,32 @@ intel_setup_dst_params(ScrnInfoPtr scrn, intel_adaptor_private *adaptor_priv, sh
}
static Bool
-intel_copy_video_data(ScrnInfoPtr scrn, intel_adaptor_private *adaptor_priv,
- short width, short height, int *dstPitch, int *dstPitch2,
- int top, int left, int npixels, int nlines,
- int id, unsigned char *buf)
+intel_setup_video_buffer(ScrnInfoPtr scrn, intel_adaptor_private *adaptor_priv,
+ int alloc_size, int id, unsigned char *buf)
+{
+ intel_screen_private *intel = intel_get_screen_private(scrn);
+
+ /* Free the current buffer if we're going to have to reallocate */
+ if (adaptor_priv->buf && adaptor_priv->buf->size < alloc_size)
+ intel_free_video_buffers(adaptor_priv);
+
+ if (adaptor_priv->buf == NULL) {
+ adaptor_priv->buf = drm_intel_bo_alloc(intel->bufmgr, "xv buffer",
+ alloc_size, 4096);
+ if (adaptor_priv->buf == NULL)
+ return FALSE;
+
+ adaptor_priv->reusable = TRUE;
+ }
+
+ return TRUE;
+}
+
+Bool
+intel_video_copy_data(ScrnInfoPtr scrn, intel_adaptor_private *adaptor_priv,
+ short width, short height, int *dstPitch, int *dstPitch2,
+ int top, int left, int npixels, int nlines,
+ int id, unsigned char *buf)
{
int srcPitch = 0, srcPitch2 = 0;
int size;
@@ -1485,217 +682,108 @@ intel_copy_video_data(ScrnInfoPtr scrn, intel_adaptor_private *adaptor_priv,
/* copy data */
if (is_planar_fourcc(id)) {
- return I830CopyPlanarData(adaptor_priv, buf, srcPitch, srcPitch2,
+ return intel_video_copy_planar_data(adaptor_priv, buf, srcPitch, srcPitch2,
*dstPitch, *dstPitch2,
height, top, left, nlines,
npixels, id);
} else {
- return I830CopyPackedData(adaptor_priv, buf, srcPitch, *dstPitch, top, left,
+ return intel_video_copy_packed_data(adaptor_priv, buf, srcPitch, *dstPitch, top, left,
nlines, npixels);
}
}
-/*
- * The source rectangle of the video is defined by (src_x, src_y, src_w, src_h).
- * The dest rectangle of the video is defined by (drw_x, drw_y, drw_w, drw_h).
- * id is a fourcc code for the format of the video.
- * buf is the pointer to the source data in system memory.
- * width and height are the w/h of the source data.
- * If "sync" is TRUE, then we must be finished with *buf at the point of return
- * (which we always are).
- * clipBoxes is the clipping region in screen space.
- * data is a pointer to our port private.
- * drawable is some Drawable, which might not be the screen in the case of
- * compositing. It's a new argument to the function in the 1.1 server.
- */
-static int
-I830PutImageTextured(ScrnInfoPtr scrn,
- short src_x, short src_y,
- short drw_x, short drw_y,
- short src_w, short src_h,
- short drw_w, short drw_h,
- int id, unsigned char *buf,
- short width, short height,
- Bool sync, RegionPtr clipBoxes, pointer data,
- DrawablePtr drawable)
+int is_planar_fourcc(int id)
{
- intel_screen_private *intel = intel_get_screen_private(scrn);
- intel_adaptor_private *adaptor_priv = (intel_adaptor_private *) data;
- PixmapPtr pixmap = get_drawable_pixmap(drawable);
- int dstPitch, dstPitch2;
- BoxRec dstBox;
- xf86CrtcPtr crtc;
- int top, left, npixels, nlines;
-
- if (!intel_pixmap_is_offscreen(pixmap))
- return BadAlloc;
-
-#if 0
- ErrorF("I830PutImage: src: (%d,%d)(%d,%d), dst: (%d,%d)(%d,%d)\n"
- "width %d, height %d\n", src_x, src_y, src_w, src_h, drw_x,
- drw_y, drw_w, drw_h, width, height);
+ switch (id) {
+ case FOURCC_YV12:
+ case FOURCC_I420:
+#ifdef INTEL_XVMC
+ case FOURCC_XVMC:
#endif
-
- if (!intel_clip_video_helper(scrn,
- adaptor_priv,
- &crtc,
- &dstBox,
- src_x, src_y, drw_x, drw_y,
- src_w, src_h, drw_w, drw_h,
- id,
- &top, &left, &npixels, &nlines, clipBoxes,
- width, height))
- return Success;
-
- if (xvmc_passthrough(id)) {
- uint32_t *gem_handle = (uint32_t *)buf;
- int size;
-
- intel_setup_dst_params(scrn, adaptor_priv, width, height,
- &dstPitch, &dstPitch2, &size, id);
-
- if (IS_I915G(intel) || IS_I915GM(intel)) {
- /* XXX: i915 is not support and needs some
- * serious care. grep for KMS in i915_hwmc.c */
- return BadAlloc;
- }
-
- if (adaptor_priv->buf)
- drm_intel_bo_unreference(adaptor_priv->buf);
-
- adaptor_priv->buf =
- drm_intel_bo_gem_create_from_name(intel->bufmgr,
- "xvmc surface",
- *gem_handle);
- if (adaptor_priv->buf == NULL)
- return BadAlloc;
-
- adaptor_priv->reusable = FALSE;
- } else {
- if (!intel_copy_video_data(scrn, adaptor_priv, width, height,
- &dstPitch, &dstPitch2,
- top, left, npixels, nlines, id, buf))
- return BadAlloc;
- }
-
- if (crtc && adaptor_priv->SyncToVblank != 0 && INTEL_INFO(intel)->gen < 060) {
- intel_wait_for_scanline(scrn, pixmap, crtc, clipBoxes);
- }
-
- if (INTEL_INFO(intel)->gen >= 060) {
- Gen6DisplayVideoTextured(scrn, adaptor_priv, id, clipBoxes,
- width, height, dstPitch, dstPitch2,
- src_w, src_h,
- drw_w, drw_h, pixmap);
- } else if (INTEL_INFO(intel)->gen >= 040) {
- I965DisplayVideoTextured(scrn, adaptor_priv, id, clipBoxes,
- width, height, dstPitch, dstPitch2,
- src_w, src_h,
- drw_w, drw_h, pixmap);
- } else {
- I915DisplayVideoTextured(scrn, adaptor_priv, id, clipBoxes,
- width, height, dstPitch, dstPitch2,
- src_w, src_h, drw_w, drw_h,
- pixmap);
+ return 1;
+ case FOURCC_UYVY:
+ case FOURCC_YUY2:
+ return 0;
+ default:
+ ErrorF("Unknown format 0x%x\n", id);
+ return 0;
}
-
- intel_get_screen_private(scrn)->needs_flush = TRUE;
- DamageDamageRegion(drawable, clipBoxes);
-
- /* And make sure the WAIT_FOR_EVENT is queued before any
- * modesetting/dpms operations on the pipe.
- */
- intel_batch_submit(scrn);
-
- return Success;
}
-static int
-I830PutImageOverlay(ScrnInfoPtr scrn,
- short src_x, short src_y,
- short drw_x, short drw_y,
- short src_w, short src_h,
- short drw_w, short drw_h,
- int id, unsigned char *buf,
- short width, short height,
- Bool sync, RegionPtr clipBoxes, pointer data,
- DrawablePtr drawable)
+Bool
+intel_clip_video_helper(ScrnInfoPtr scrn,
+ intel_adaptor_private *adaptor_priv,
+ xf86CrtcPtr * crtc_ret,
+ BoxPtr dst,
+ short src_x, short src_y,
+ short drw_x, short drw_y,
+ short src_w, short src_h,
+ short drw_w, short drw_h,
+ int id,
+ int *top, int* left, int* npixels, int *nlines,
+ RegionPtr reg, INT32 width, INT32 height)
{
- intel_adaptor_private *adaptor_priv = (intel_adaptor_private *) data;
- int dstPitch, dstPitch2;
- BoxRec dstBox;
+ Bool ret;
+ RegionRec crtc_region_local;
+ RegionPtr crtc_region = reg;
+ BoxRec crtc_box;
+ INT32 x1, x2, y1, y2;
xf86CrtcPtr crtc;
- int top, left, npixels, nlines;
-#if 0
- ErrorF("I830PutImage: src: (%d,%d)(%d,%d), dst: (%d,%d)(%d,%d)\n"
- "width %d, height %d\n", src_x, src_y, src_w, src_h, drw_x,
- drw_y, drw_w, drw_h, width, height);
-#endif
+ x1 = src_x;
+ x2 = src_x + src_w;
+ y1 = src_y;
+ y2 = src_y + src_h;
- /* If dst width and height are less than 1/8th the src size, the
- * src/dst scale factor becomes larger than 8 and doesn't fit in
- * the scale register. */
- if (src_w >= (drw_w * 8))
- drw_w = src_w / 7;
-
- if (src_h >= (drw_h * 8))
- drw_h = src_h / 7;
-
- if (!intel_clip_video_helper(scrn,
- adaptor_priv,
- &crtc,
- &dstBox,
- src_x, src_y, drw_x, drw_y,
- src_w, src_h, drw_w, drw_h,
- id,
- &top, &left, &npixels, &nlines, clipBoxes,
- width, height))
- return Success;
-
- /* overlay can't handle rotation natively, store it for the copy func */
- if (crtc)
- adaptor_priv->rotation = crtc->rotation;
- else {
- xf86DrvMsg(scrn->scrnIndex, X_WARNING,
- "Fail to clip video to any crtc!\n");
- return Success;
- }
+ dst->x1 = drw_x;
+ dst->x2 = drw_x + drw_w;
+ dst->y1 = drw_y;
+ dst->y2 = drw_y + drw_h;
+
+ /*
+ * For overlay video, compute the relevant CRTC and
+ * clip video to that
+ */
+ crtc = intel_covering_crtc(scrn, dst, adaptor_priv->desired_crtc,
+ &crtc_box);
- if (!intel_copy_video_data(scrn, adaptor_priv, width, height,
- &dstPitch, &dstPitch2,
- top, left, npixels, nlines, id, buf))
- return BadAlloc;
-
- if (!intel_display_overlay
- (scrn, crtc, id, width, height, dstPitch, dstPitch2,
- &dstBox, src_w, src_h, drw_w, drw_h))
- return BadAlloc;
-
- /* update cliplist */
- if (!REGION_EQUAL(scrn->pScreen, &adaptor_priv->clip, clipBoxes)) {
- REGION_COPY(scrn->pScreen, &adaptor_priv->clip, clipBoxes);
- xf86XVFillKeyHelperDrawable(drawable,
- adaptor_priv->colorKey,
- clipBoxes);
+ /* For textured video, we don't actually want to clip at all. */
+ if (crtc && !adaptor_priv->textured) {
+ REGION_INIT(screen, &crtc_region_local, &crtc_box, 1);
+ crtc_region = &crtc_region_local;
+ REGION_INTERSECT(screen, crtc_region, crtc_region,
+ reg);
}
+ *crtc_ret = crtc;
- adaptor_priv->videoStatus = CLIENT_VIDEO_ON;
+ ret = xf86XVClipVideoHelper(dst, &x1, &x2, &y1, &y2,
+ crtc_region, width, height);
+ if (crtc_region != reg)
+ REGION_UNINIT(screen, &crtc_region_local);
- return Success;
+ *top = y1 >> 16;
+ *left = (x1 >> 16) & ~1;
+ *npixels = ALIGN(((x2 + 0xffff) >> 16), 2) - *left;
+ if (is_planar_fourcc(id)) {
+ *top &= ~1;
+ *nlines = ALIGN(((y2 + 0xffff) >> 16), 2) - *top;
+ } else
+ *nlines = ((y2 + 0xffff) >> 16) - *top;
+
+ return ret;
}
-static int
-I830QueryImageAttributes(ScrnInfoPtr scrn,
- int id,
- unsigned short *w, unsigned short *h,
- int *pitches, int *offsets)
+int
+intel_video_query_image_attributes(ScrnInfoPtr scrn,
+ int id,
+ unsigned short *w, unsigned short *h,
+ int *pitches, int *offsets)
{
intel_screen_private *intel = intel_get_screen_private(scrn);
int size, tmp;
#if 0
- ErrorF("I830QueryImageAttributes: w is %d, h is %d\n", *w, *h);
+ ErrorF("intel_video_query_image_attributes: w is %d, h is %d\n", *w, *h);
#endif
if (IS_845G(intel) || IS_I830(intel)) {
@@ -1771,6 +859,30 @@ I830QueryImageAttributes(ScrnInfoPtr scrn,
return size;
}
+void intel_video_stop_video(ScrnInfoPtr scrn, pointer data, Bool shutdown)
+{
+ intel_adaptor_private *adaptor_priv = (intel_adaptor_private *) data;
+
+ if (adaptor_priv->textured)
+ return;
+
+ REGION_EMPTY(scrn->pScreen, &adaptor_priv->clip);
+
+ if (shutdown) {
+ if (adaptor_priv->videoStatus & CLIENT_VIDEO_ON)
+ intel_video_overlay_off(intel_get_screen_private(scrn));
+
+ intel_free_video_buffers(adaptor_priv);
+ adaptor_priv->videoStatus = 0;
+ } else {
+ if (adaptor_priv->videoStatus & CLIENT_VIDEO_ON) {
+ adaptor_priv->videoStatus |= OFF_TIMER;
+ adaptor_priv->offTime = currentTime.milliseconds + OFF_DELAY;
+ }
+ }
+
+}
+
void
intel_video_block_handler(intel_screen_private *intel)
{
@@ -1785,7 +897,7 @@ intel_video_block_handler(intel_screen_private *intel)
Time now = currentTime.milliseconds;
if (adaptor_priv->offTime < now) {
/* Turn off the overlay */
- intel_overlay_off(intel);
+ intel_video_overlay_off(intel);
intel_free_video_buffers(adaptor_priv);
adaptor_priv->videoStatus = 0;
}
diff --git a/src/uxa/intel_video.h b/src/uxa/intel_video.h
index f405d40b..09cc4775 100644
--- a/src/uxa/intel_video.h
+++ b/src/uxa/intel_video.h
@@ -1,29 +1,32 @@
/***************************************************************************
-
-Copyright 2000 Intel Corporation. All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a
-copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sub license, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice (including the
-next paragraph) shall be included in all copies or substantial portions
-of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
-IN NO EVENT SHALL INTEL, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
-DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
+
+Copyright 2000 Intel Corporation. All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sub license, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice (including the
+next paragraph) shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+IN NO EVENT SHALL INTEL, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
+DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
THE USE OR OTHER DEALINGS IN THE SOFTWARE.
**************************************************************************/
+#ifndef _INTEL_VIDEO_H_
+#define _INTEL_VIDEO_H_
+
#include "xf86.h"
#include "xf86_OSproc.h"
@@ -61,35 +64,100 @@ typedef struct {
int SyncToVblank; /* -1: auto, 0: off, 1: on */
} intel_adaptor_private;
+#define OFF_DELAY 250 /* milliseconds */
+
+#define OFF_TIMER 0x01
+#define CLIENT_VIDEO_ON 0x02
+
static inline intel_adaptor_private *
intel_get_adaptor_private(intel_screen_private *intel)
{
return intel->adaptor->pPortPrivates[0].ptr;
}
-void I915DisplayVideoTextured(ScrnInfoPtr scrn,
- intel_adaptor_private *adaptor_priv,
- int id, RegionPtr dstRegion, short width,
- short height, int video_pitch, int video_pitch2,
- short src_w, short src_h,
- short drw_w, short drw_h, PixmapPtr pixmap);
-
-void I965DisplayVideoTextured(ScrnInfoPtr scrn,
- intel_adaptor_private *adaptor_priv,
- int id, RegionPtr dstRegion, short width,
- short height, int video_pitch, int video_pitch2,
- short src_w, short src_h,
- short drw_w, short drw_h, PixmapPtr pixmap);
-
-void Gen6DisplayVideoTextured(ScrnInfoPtr scrn,
- intel_adaptor_private *adaptor_priv,
- int id, RegionPtr dstRegion, short width,
- short height, int video_pitch, int video_pitch2,
- short src_w, short src_h,
- short drw_w, short drw_h, PixmapPtr pixmap);
-
-void i965_free_video(ScrnInfoPtr scrn);
-
int is_planar_fourcc(int id);
void intel_video_block_handler(intel_screen_private *intel);
+
+int intel_video_query_image_attributes(ScrnInfoPtr, int, unsigned short *,
+ unsigned short *, int *, int *);
+
+Bool
+intel_video_copy_data(ScrnInfoPtr scrn, intel_adaptor_private *adaptor_priv,
+ short width, short height, int *dstPitch, int *dstPitch2,
+ int top, int left, int npixels, int nlines,
+ int id, unsigned char *buf);
+
+Bool
+intel_clip_video_helper(ScrnInfoPtr scrn,
+ intel_adaptor_private *adaptor_priv,
+ xf86CrtcPtr * crtc_ret,
+ BoxPtr dst,
+ short src_x, short src_y,
+ short drw_x, short drw_y,
+ short src_w, short src_h,
+ short drw_w, short drw_h,
+ int id,
+ int *top, int* left, int* npixels, int *nlines,
+ RegionPtr reg, INT32 width, INT32 height);
+
+void
+intel_free_video_buffers(intel_adaptor_private *adaptor_priv);
+
+int
+intel_video_get_port_attribute(ScrnInfoPtr scrn,
+ Atom attribute, INT32 * value, pointer data);
+
+void
+intel_video_query_best_size(ScrnInfoPtr, Bool,
+ short, short, short, short, unsigned int *,
+ unsigned int *, pointer);
+
+void
+intel_setup_dst_params(ScrnInfoPtr scrn, intel_adaptor_private *adaptor_priv, short width,
+ short height, int *dstPitch, int *dstPitch2, int *size,
+ int id);
+
+void intel_video_stop_video(ScrnInfoPtr scrn, pointer data, Bool shutdown);
+
+extern Atom intel_xv_Brightness, intel_xv_Contrast, intel_xv_Saturation, intel_xv_ColorKey, intel_xv_Pipe;
+extern Atom intel_xv_Gamma0, intel_xv_Gamma1, intel_xv_Gamma2, intel_xv_Gamma3, intel_xv_Gamma4, intel_xv_Gamma5;
+extern Atom intel_xv_SyncToVblank;
+
+#define MAKE_ATOM(a) MakeAtom(a, sizeof(a) - 1, TRUE)
+
+/* Limits for the overlay/textured video source sizes. The documented hardware
+ * limits are 2048x2048 or better for overlay and both of our textured video
+ * implementations. Additionally, on the 830 and 845, larger sizes resulted in
+ * the card hanging, so we keep the limits lower there.
+ */
+#define IMAGE_MAX_WIDTH 2048
+#define IMAGE_MAX_HEIGHT 2048
+#define IMAGE_MAX_WIDTH_LEGACY 1024
+#define IMAGE_MAX_HEIGHT_LEGACY 1088
+
+extern const XF86VideoEncodingRec intel_xv_dummy_encoding[1];
+
+#define NUM_FORMATS 3
+
+extern XF86VideoFormatRec intel_xv_formats[NUM_FORMATS];
+
+#define NUM_ATTRIBUTES 5
+
+extern XF86AttributeRec intel_xv_attributes[NUM_ATTRIBUTES];
+
+#define GAMMA_ATTRIBUTES 6
+
+extern XF86AttributeRec intel_xv_gamma_attributes[GAMMA_ATTRIBUTES];
+
+#ifdef INTEL_XVMC
+#define NUM_IMAGES 5
+#define XVMC_IMAGE 1
+#else
+#define NUM_IMAGES 4
+#define XVMC_IMAGE 0
+#endif
+
+extern XF86ImageRec intel_xv_images[NUM_IMAGES];
+
+#endif /* _INTEL_VIDEO_H_ */
diff --git a/src/uxa/intel_video_overlay.c b/src/uxa/intel_video_overlay.c
new file mode 100644
index 00000000..8e0eb7af
--- /dev/null
+++ b/src/uxa/intel_video_overlay.c
@@ -0,0 +1,554 @@
+/***************************************************************************
+
+ Copyright 2000 Intel Corporation. All Rights Reserved.
+
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sub license, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice (including the
+ next paragraph) shall be included in all copies or substantial portions
+ of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+ IN NO EVENT SHALL INTEL, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
+ THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ **************************************************************************/
+
+/*
+ * i830_video.c: i830/i845 Xv driver.
+ *
+ * Copyright © 2002 by Alan Hourihane and David Dawes
+ *
+ * Authors:
+ * Alan Hourihane <alanh@tungstengraphics.com>
+ * David Dawes <dawes@xfree86.org>
+ *
+ * Derived from i810 Xv driver:
+ *
+ * Authors of i810 code:
+ * Jonathan Bian <jonathan.bian@intel.com>
+ * Offscreen Images:
+ * Matt Sottek <matthew.j.sottek@intel.com>
+ */
+
+/*
+ * XXX Could support more formats.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <inttypes.h>
+#include <math.h>
+#include <string.h>
+#include <assert.h>
+#include <errno.h>
+
+#include "xorg-server.h"
+#include "xf86.h"
+#include "xf86_OSproc.h"
+#include "compiler.h"
+#include "xf86Pci.h"
+#include "xf86fbman.h"
+#include "xf86drm.h"
+#include "regionstr.h"
+#include "randrstr.h"
+#include "windowstr.h"
+#include "damage.h"
+#include "intel.h"
+#include "intel_video.h"
+#include "i830_reg.h"
+#include "xf86xv.h"
+#include <X11/extensions/Xv.h>
+#include "dixstruct.h"
+#include "fourcc.h"
+#include "intel_video_overlay.h"
+
+/* overlay debugging printf function */
+#if 0
+#define OVERLAY_DEBUG ErrorF
+#else
+#define OVERLAY_DEBUG if (0) ErrorF
+#endif
+
+/* kernel modesetting overlay functions */
+static Bool intel_has_overlay(intel_screen_private *intel)
+{
+ struct drm_i915_getparam gp;
+ int has_overlay = 0;
+ int ret;
+
+ gp.param = I915_PARAM_HAS_OVERLAY;
+ gp.value = &has_overlay;
+ ret = drmCommandWriteRead(intel->drmSubFD, DRM_I915_GETPARAM, &gp, sizeof(gp));
+
+ return ret == 0 && !! has_overlay;
+}
+
+static Bool intel_overlay_update_attrs(intel_screen_private *intel)
+{
+ intel_adaptor_private *adaptor_priv = intel_get_adaptor_private(intel);
+ struct drm_intel_overlay_attrs attrs;
+
+ attrs.flags = I915_OVERLAY_UPDATE_ATTRS;
+ attrs.brightness = adaptor_priv->brightness;
+ attrs.contrast = adaptor_priv->contrast;
+ attrs.saturation = adaptor_priv->saturation;
+ attrs.color_key = adaptor_priv->colorKey;
+ attrs.gamma0 = adaptor_priv->gamma0;
+ attrs.gamma1 = adaptor_priv->gamma1;
+ attrs.gamma2 = adaptor_priv->gamma2;
+ attrs.gamma3 = adaptor_priv->gamma3;
+ attrs.gamma4 = adaptor_priv->gamma4;
+ attrs.gamma5 = adaptor_priv->gamma5;
+
+ return drmCommandWriteRead(intel->drmSubFD, DRM_I915_OVERLAY_ATTRS,
+ &attrs, sizeof(attrs)) == 0;
+}
+
+void intel_video_overlay_off(intel_screen_private *intel)
+{
+ struct drm_intel_overlay_put_image request;
+ int ret;
+
+ request.flags = 0;
+
+ ret = drmCommandWrite(intel->drmSubFD, DRM_I915_OVERLAY_PUT_IMAGE,
+ &request, sizeof(request));
+ (void) ret;
+}
+static int
+intel_video_overlay_set_port_attribute(ScrnInfoPtr scrn,
+ Atom attribute, INT32 value, pointer data)
+{
+ intel_adaptor_private *adaptor_priv = (intel_adaptor_private *) data;
+ intel_screen_private *intel = intel_get_screen_private(scrn);
+
+ if (attribute == intel_xv_Brightness) {
+ if ((value < -128) || (value > 127))
+ return BadValue;
+ adaptor_priv->brightness = value;
+ OVERLAY_DEBUG("BRIGHTNESS\n");
+ } else if (attribute == intel_xv_Contrast) {
+ if ((value < 0) || (value > 255))
+ return BadValue;
+ adaptor_priv->contrast = value;
+ OVERLAY_DEBUG("CONTRAST\n");
+ } else if (attribute == intel_xv_Saturation) {
+ if ((value < 0) || (value > 1023))
+ return BadValue;
+ adaptor_priv->saturation = value;
+ } else if (attribute == intel_xv_Pipe) {
+ xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
+ if ((value < -1) || (value >= xf86_config->num_crtc))
+ return BadValue;
+ if (value < 0)
+ adaptor_priv->desired_crtc = NULL;
+ else
+ adaptor_priv->desired_crtc = xf86_config->crtc[value];
+ } else if (attribute == intel_xv_Gamma0 && (INTEL_INFO(intel)->gen >= 030)) {
+ adaptor_priv->gamma0 = value;
+ } else if (attribute == intel_xv_Gamma1 && (INTEL_INFO(intel)->gen >= 030)) {
+ adaptor_priv->gamma1 = value;
+ } else if (attribute == intel_xv_Gamma2 && (INTEL_INFO(intel)->gen >= 030)) {
+ adaptor_priv->gamma2 = value;
+ } else if (attribute == intel_xv_Gamma3 && (INTEL_INFO(intel)->gen >= 030)) {
+ adaptor_priv->gamma3 = value;
+ } else if (attribute == intel_xv_Gamma4 && (INTEL_INFO(intel)->gen >= 030)) {
+ adaptor_priv->gamma4 = value;
+ } else if (attribute == intel_xv_Gamma5 && (INTEL_INFO(intel)->gen >= 030)) {
+ adaptor_priv->gamma5 = value;
+ } else if (attribute == intel_xv_ColorKey) {
+ adaptor_priv->colorKey = value;
+ OVERLAY_DEBUG("COLORKEY\n");
+ } else
+ return BadMatch;
+
+ if ((attribute == intel_xv_Gamma0 ||
+ attribute == intel_xv_Gamma1 ||
+ attribute == intel_xv_Gamma2 ||
+ attribute == intel_xv_Gamma3 ||
+ attribute == intel_xv_Gamma4 ||
+ attribute == intel_xv_Gamma5) && (INTEL_INFO(intel)->gen >= 030)) {
+ OVERLAY_DEBUG("GAMMA\n");
+ }
+
+ if (!intel_overlay_update_attrs(intel))
+ return BadValue;
+
+ if (attribute == intel_xv_ColorKey)
+ REGION_EMPTY(scrn->pScreen, &adaptor_priv->clip);
+
+ return Success;
+}
+
+static Bool
+intel_overlay_put_image(intel_screen_private *intel,
+ xf86CrtcPtr crtc,
+ int id, short width, short height,
+ int dstPitch, int dstPitch2,
+ BoxPtr dstBox, short src_w, short src_h, short drw_w,
+ short drw_h)
+{
+ intel_adaptor_private *adaptor_priv = intel_get_adaptor_private(intel);
+ struct drm_intel_overlay_put_image request;
+ int ret;
+ int planar = is_planar_fourcc(id);
+ float scale;
+ dri_bo *tmp;
+
+ request.flags = I915_OVERLAY_ENABLE;
+
+ request.bo_handle = adaptor_priv->buf->handle;
+ if (planar) {
+ request.stride_Y = dstPitch2;
+ request.stride_UV = dstPitch;
+ } else {
+ request.stride_Y = dstPitch;
+ request.stride_UV = 0;
+ }
+ request.offset_Y = adaptor_priv->YBufOffset;
+ request.offset_U = adaptor_priv->UBufOffset;
+ request.offset_V = adaptor_priv->VBufOffset;
+ OVERLAY_DEBUG("off_Y: %i, off_U: %i, off_V: %i\n", request.offset_Y,
+ request.offset_U, request.offset_V);
+
+ request.crtc_id = intel_crtc_id(crtc);
+ request.dst_x = dstBox->x1;
+ request.dst_y = dstBox->y1;
+ request.dst_width = dstBox->x2 - dstBox->x1;
+ request.dst_height = dstBox->y2 - dstBox->y1;
+
+ request.src_width = width;
+ request.src_height = height;
+ /* adjust src dimensions */
+ if (request.dst_height > 1) {
+ scale = ((float)request.dst_height - 1) / ((float)drw_h - 1);
+ request.src_scan_height = src_h * scale;
+ } else
+ request.src_scan_height = 1;
+
+ if (request.dst_width > 1) {
+ scale = ((float)request.dst_width - 1) / ((float)drw_w - 1);
+ request.src_scan_width = src_w * scale;
+ } else
+ request.src_scan_width = 1;
+
+ if (planar) {
+ request.flags |= I915_OVERLAY_YUV_PLANAR | I915_OVERLAY_YUV420;
+ } else {
+ request.flags |= I915_OVERLAY_YUV_PACKED | I915_OVERLAY_YUV422;
+ if (id == FOURCC_UYVY)
+ request.flags |= I915_OVERLAY_Y_SWAP;
+ }
+
+ ret = drmCommandWrite(intel->drmSubFD, DRM_I915_OVERLAY_PUT_IMAGE,
+ &request, sizeof(request));
+ if (ret)
+ return FALSE;
+
+ if (!adaptor_priv->reusable) {
+ drm_intel_bo_unreference(adaptor_priv->buf);
+ adaptor_priv->buf = NULL;
+ adaptor_priv->reusable = TRUE;
+ }
+
+ tmp = adaptor_priv->old_buf[1];
+ adaptor_priv->old_buf[1] = adaptor_priv->old_buf[0];
+ adaptor_priv->old_buf[0] = adaptor_priv->buf;
+ adaptor_priv->buf = tmp;
+
+ return TRUE;
+}
+
+static void
+intel_update_dst_box_to_crtc_coords(ScrnInfoPtr scrn, xf86CrtcPtr crtc,
+ BoxPtr dstBox)
+{
+ int tmp;
+
+ /* for overlay, we should take it from crtc's screen
+ * coordinate to current crtc's display mode.
+ * yeah, a bit confusing.
+ */
+ switch (crtc->rotation & 0xf) {
+ case RR_Rotate_0:
+ dstBox->x1 -= crtc->x;
+ dstBox->x2 -= crtc->x;
+ dstBox->y1 -= crtc->y;
+ dstBox->y2 -= crtc->y;
+ break;
+ case RR_Rotate_90:
+ tmp = dstBox->x1;
+ dstBox->x1 = dstBox->y1 - crtc->x;
+ dstBox->y1 = scrn->virtualX - tmp - crtc->y;
+ tmp = dstBox->x2;
+ dstBox->x2 = dstBox->y2 - crtc->x;
+ dstBox->y2 = scrn->virtualX - tmp - crtc->y;
+ tmp = dstBox->y1;
+ dstBox->y1 = dstBox->y2;
+ dstBox->y2 = tmp;
+ break;
+ case RR_Rotate_180:
+ tmp = dstBox->x1;
+ dstBox->x1 = scrn->virtualX - dstBox->x2 - crtc->x;
+ dstBox->x2 = scrn->virtualX - tmp - crtc->x;
+ tmp = dstBox->y1;
+ dstBox->y1 = scrn->virtualY - dstBox->y2 - crtc->y;
+ dstBox->y2 = scrn->virtualY - tmp - crtc->y;
+ break;
+ case RR_Rotate_270:
+ tmp = dstBox->x1;
+ dstBox->x1 = scrn->virtualY - dstBox->y1 - crtc->x;
+ dstBox->y1 = tmp - crtc->y;
+ tmp = dstBox->x2;
+ dstBox->x2 = scrn->virtualY - dstBox->y2 - crtc->x;
+ dstBox->y2 = tmp - crtc->y;
+ tmp = dstBox->x1;
+ dstBox->x1 = dstBox->x2;
+ dstBox->x2 = tmp;
+ break;
+ }
+
+ return;
+}
+
+static Bool
+intel_video_overlay_display(ScrnInfoPtr scrn, xf86CrtcPtr crtc,
+ int id, short width, short height,
+ int dstPitch, int dstPitch2,
+ BoxPtr dstBox, short src_w, short src_h, short drw_w,
+ short drw_h)
+{
+ intel_screen_private *intel = intel_get_screen_private(scrn);
+ int tmp;
+
+ OVERLAY_DEBUG("I830DisplayVideo: %dx%d (pitch %d)\n", width, height,
+ dstPitch);
+
+ /*
+ * If the video isn't visible on any CRTC, turn it off
+ */
+ if (!crtc) {
+ intel_video_overlay_off(intel);
+ return TRUE;
+ }
+
+ intel_update_dst_box_to_crtc_coords(scrn, crtc, dstBox);
+
+ if (crtc->rotation & (RR_Rotate_90 | RR_Rotate_270)) {
+ tmp = width;
+ width = height;
+ height = tmp;
+ tmp = drw_w;
+ drw_w = drw_h;
+ drw_h = tmp;
+ tmp = src_w;
+ src_w = src_h;
+ src_h = tmp;
+ }
+
+ return intel_overlay_put_image(intel, crtc, id,
+ width, height,
+ dstPitch, dstPitch2, dstBox,
+ src_w, src_h, drw_w, drw_h);
+}
+
+static int
+intel_video_overlay_put_image(ScrnInfoPtr scrn,
+ short src_x, short src_y,
+ short drw_x, short drw_y,
+ short src_w, short src_h,
+ short drw_w, short drw_h,
+ int id, unsigned char *buf,
+ short width, short height,
+ Bool sync, RegionPtr clipBoxes, pointer data,
+ DrawablePtr drawable)
+{
+ intel_adaptor_private *adaptor_priv = (intel_adaptor_private *) data;
+ int dstPitch, dstPitch2;
+ BoxRec dstBox;
+ xf86CrtcPtr crtc;
+ int top, left, npixels, nlines;
+
+#if 0
+ ErrorF("I830PutImage: src: (%d,%d)(%d,%d), dst: (%d,%d)(%d,%d)\n"
+ "width %d, height %d\n", src_x, src_y, src_w, src_h, drw_x,
+ drw_y, drw_w, drw_h, width, height);
+#endif
+
+ /* If dst width and height are less than 1/8th the src size, the
+ * src/dst scale factor becomes larger than 8 and doesn't fit in
+ * the scale register. */
+ if (src_w >= (drw_w * 8))
+ drw_w = src_w / 7;
+
+ if (src_h >= (drw_h * 8))
+ drw_h = src_h / 7;
+
+ if (!intel_clip_video_helper(scrn,
+ adaptor_priv,
+ &crtc,
+ &dstBox,
+ src_x, src_y, drw_x, drw_y,
+ src_w, src_h, drw_w, drw_h,
+ id,
+ &top, &left, &npixels, &nlines, clipBoxes,
+ width, height))
+ return Success;
+
+ /* overlay can't handle rotation natively, store it for the copy func */
+ if (crtc)
+ adaptor_priv->rotation = crtc->rotation;
+ else {
+ xf86DrvMsg(scrn->scrnIndex, X_WARNING,
+ "Fail to clip video to any crtc!\n");
+ return Success;
+ }
+
+ if (!intel_video_copy_data(scrn, adaptor_priv, width, height,
+ &dstPitch, &dstPitch2,
+ top, left, npixels, nlines, id, buf))
+ return BadAlloc;
+
+ if (!intel_video_overlay_display
+ (scrn, crtc, id, width, height, dstPitch, dstPitch2,
+ &dstBox, src_w, src_h, drw_w, drw_h))
+ return BadAlloc;
+
+ /* update cliplist */
+ if (!REGION_EQUAL(scrn->pScreen, &adaptor_priv->clip, clipBoxes)) {
+ REGION_COPY(scrn->pScreen, &adaptor_priv->clip, clipBoxes);
+ xf86XVFillKeyHelperDrawable(drawable,
+ adaptor_priv->colorKey,
+ clipBoxes);
+ }
+
+ adaptor_priv->videoStatus = CLIENT_VIDEO_ON;
+
+ return Success;
+}
+
+XF86VideoAdaptorPtr intel_video_overlay_setup_image(ScreenPtr screen)
+{
+ ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
+ intel_screen_private *intel = intel_get_screen_private(scrn);
+ XF86VideoAdaptorPtr adapt;
+ intel_adaptor_private *adaptor_priv;
+ XF86AttributePtr att;
+
+ /* Set up overlay video if it is available */
+ intel->use_overlay = intel_has_overlay(intel);
+ if (!intel->use_overlay)
+ return NULL;
+
+ OVERLAY_DEBUG("intel_video_overlay_setup_image\n");
+
+ if (!(adapt = calloc(1,
+ sizeof(XF86VideoAdaptorRec) +
+ sizeof(intel_adaptor_private) +
+ sizeof(DevUnion))))
+ return NULL;
+
+ adapt->type = XvWindowMask | XvInputMask | XvImageMask;
+ adapt->flags = VIDEO_OVERLAID_IMAGES /*| VIDEO_CLIP_TO_VIEWPORT */ ;
+ adapt->name = "Intel(R) Video Overlay";
+ adapt->nEncodings = 1;
+ adapt->pEncodings = xnfalloc(sizeof(intel_xv_dummy_encoding));
+ memcpy(adapt->pEncodings, intel_xv_dummy_encoding, sizeof(intel_xv_dummy_encoding));
+ if (IS_845G(intel) || IS_I830(intel)) {
+ adapt->pEncodings->width = IMAGE_MAX_WIDTH_LEGACY;
+ adapt->pEncodings->height = IMAGE_MAX_HEIGHT_LEGACY;
+ }
+ adapt->nFormats = NUM_FORMATS;
+ adapt->pFormats = intel_xv_formats;
+ adapt->nPorts = 1;
+ adapt->pPortPrivates = (DevUnion *) (&adapt[1]);
+
+ adaptor_priv = (intel_adaptor_private *)&adapt->pPortPrivates[1];
+
+ adapt->pPortPrivates[0].ptr = (pointer) (adaptor_priv);
+ adapt->nAttributes = NUM_ATTRIBUTES;
+ if (INTEL_INFO(intel)->gen >= 030)
+ adapt->nAttributes += GAMMA_ATTRIBUTES; /* has gamma */
+ adapt->pAttributes =
+ xnfalloc(sizeof(XF86AttributeRec) * adapt->nAttributes);
+ /* Now copy the attributes */
+ att = adapt->pAttributes;
+ memcpy((char *)att, (char *)intel_xv_attributes,
+ sizeof(XF86AttributeRec) * NUM_ATTRIBUTES);
+ att += NUM_ATTRIBUTES;
+ if (INTEL_INFO(intel)->gen >= 030) {
+ memcpy((char *)att, (char *)intel_xv_gamma_attributes,
+ sizeof(XF86AttributeRec) * GAMMA_ATTRIBUTES);
+ }
+ adapt->nImages = NUM_IMAGES - XVMC_IMAGE;
+
+ adapt->pImages = intel_xv_images;
+ adapt->PutVideo = NULL;
+ adapt->PutStill = NULL;
+ adapt->GetVideo = NULL;
+ adapt->GetStill = NULL;
+ adapt->StopVideo = intel_video_stop_video;
+ adapt->SetPortAttribute = intel_video_overlay_set_port_attribute;
+ adapt->GetPortAttribute = intel_video_get_port_attribute;
+ adapt->QueryBestSize = intel_video_query_best_size;
+ adapt->PutImage = intel_video_overlay_put_image;
+ adapt->QueryImageAttributes = intel_video_query_image_attributes;
+
+ adaptor_priv->textured = FALSE;
+ adaptor_priv->colorKey = intel->colorKey & ((1 << scrn->depth) - 1);
+ adaptor_priv->videoStatus = 0;
+ adaptor_priv->brightness = -19; /* (255/219) * -16 */
+ adaptor_priv->contrast = 75; /* 255/219 * 64 */
+ adaptor_priv->saturation = 146; /* 128/112 * 128 */
+ adaptor_priv->desired_crtc = NULL;
+ adaptor_priv->buf = NULL;
+ adaptor_priv->old_buf[0] = NULL;
+ adaptor_priv->old_buf[1] = NULL;
+ adaptor_priv->gamma5 = 0xc0c0c0;
+ adaptor_priv->gamma4 = 0x808080;
+ adaptor_priv->gamma3 = 0x404040;
+ adaptor_priv->gamma2 = 0x202020;
+ adaptor_priv->gamma1 = 0x101010;
+ adaptor_priv->gamma0 = 0x080808;
+
+ adaptor_priv->rotation = RR_Rotate_0;
+
+ /* gotta uninit this someplace */
+ REGION_NULL(screen, &adaptor_priv->clip);
+
+ intel->adaptor = adapt;
+
+ intel_xv_ColorKey = MAKE_ATOM("XV_COLORKEY");
+ intel_xv_Brightness = MAKE_ATOM("XV_BRIGHTNESS");
+ intel_xv_Contrast = MAKE_ATOM("XV_CONTRAST");
+ intel_xv_Saturation = MAKE_ATOM("XV_SATURATION");
+
+ /* Allow the pipe to be switched from pipe A to B when in clone mode */
+ intel_xv_Pipe = MAKE_ATOM("XV_PIPE");
+
+ if (INTEL_INFO(intel)->gen >= 030) {
+ intel_xv_Gamma0 = MAKE_ATOM("XV_GAMMA0");
+ intel_xv_Gamma1 = MAKE_ATOM("XV_GAMMA1");
+ intel_xv_Gamma2 = MAKE_ATOM("XV_GAMMA2");
+ intel_xv_Gamma3 = MAKE_ATOM("XV_GAMMA3");
+ intel_xv_Gamma4 = MAKE_ATOM("XV_GAMMA4");
+ intel_xv_Gamma5 = MAKE_ATOM("XV_GAMMA5");
+ }
+
+ intel_overlay_update_attrs(intel);
+
+ return adapt;
+}
diff --git a/src/uxa/intel_video_overlay.h b/src/uxa/intel_video_overlay.h
new file mode 100644
index 00000000..b318a055
--- /dev/null
+++ b/src/uxa/intel_video_overlay.h
@@ -0,0 +1,51 @@
+/***************************************************************************
+
+ Copyright 2000 Intel Corporation. All Rights Reserved.
+
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sub license, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice (including the
+ next paragraph) shall be included in all copies or substantial portions
+ of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+ IN NO EVENT SHALL INTEL, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
+ THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ **************************************************************************/
+
+/*
+ * i830_video.c: i830/i845 Xv driver.
+ *
+ * Copyright © 2002 by Alan Hourihane and David Dawes
+ *
+ * Authors:
+ * Alan Hourihane <alanh@tungstengraphics.com>
+ * David Dawes <dawes@xfree86.org>
+ *
+ * Derived from i810 Xv driver:
+ *
+ * Authors of i810 code:
+ * Jonathan Bian <jonathan.bian@intel.com>
+ * Offscreen Images:
+ * Matt Sottek <matthew.j.sottek@intel.com>
+ */
+
+#ifndef _INTEL_VIDEO_OVERLAY_H_
+#define _INTEL_VIDEO_OVERLAY_H_
+
+XF86VideoAdaptorPtr intel_video_overlay_setup_image(ScreenPtr);
+
+void intel_video_overlay_off(intel_screen_private *intel);
+
+#endif /* _INTEL_VIDEO_OVERLAY_H_ */