1dca5d7b91
If the dest pixmap is in texture memory, but source pixmap is not. Then we need to upload the source pixmap to texture memory. Previous version will upload the whole source pixmap. This commit preprocess the source pixmap, and reduce it to a smaller tempory pixmap only contains the required region. Signed-off-by: Zhigang Gong <zhigang.gong@linux.intel.com>
163 lines
5.2 KiB
C
163 lines
5.2 KiB
C
#ifndef GLAMOR_PRIV_H
|
|
#error This file can only be included by glamor_priv.h
|
|
#endif
|
|
|
|
#ifndef __GLAMOR_UTILS_H__
|
|
#define __GLAMOR_UTILS_H__
|
|
|
|
#define v_from_x_coord_x(_xscale_, _x_) ( 2 * (_x_) * (_xscale_) - 1.0)
|
|
#define v_from_x_coord_y(_yscale_, _y_) (-2 * (_y_) * (_yscale_) + 1.0)
|
|
#define v_from_x_coord_y_inverted(_yscale_, _y_) (2 * (_y_) * (_yscale_) - 1.0)
|
|
#define t_from_x_coord_x(_xscale_, _x_) ((_x_) * (_xscale_))
|
|
#define t_from_x_coord_y(_yscale_, _y_) (1.0 - (_y_) * (_yscale_))
|
|
#define t_from_x_coord_y_inverted(_yscale_, _y_) ((_y_) * (_yscale_))
|
|
|
|
#define pixmap_priv_get_scale(_pixmap_priv_, _pxscale_, _pyscale_) \
|
|
do { \
|
|
*(_pxscale_) = 1.0 / (_pixmap_priv_)->container->drawable.width; \
|
|
*(_pyscale_) = 1.0 / (_pixmap_priv_)->container->drawable.height; \
|
|
} while(0)
|
|
|
|
|
|
#define xFixedToFloat(_val_) ((float)xFixedToInt(_val_) \
|
|
+ ((float)xFixedFrac(_val_) / 65536.0))
|
|
|
|
#define glamor_picture_get_matrixf(_picture_, _matrix_) \
|
|
do { \
|
|
int _i_; \
|
|
if ((_picture_)->transform) \
|
|
{ \
|
|
for(_i_ = 0; _i_ < 3; _i_++) \
|
|
{ \
|
|
(_matrix_)[_i_ * 3 + 0] = \
|
|
xFixedToFloat((_picture_)->transform->matrix[_i_][0]); \
|
|
(_matrix_)[_i_ * 3 + 1] = \
|
|
xFixedToFloat((_picture_)->transform->matrix[_i_][1]); \
|
|
(_matrix_)[_i_ * 3 + 2] = \
|
|
xFixedToFloat((_picture_)->transform->matrix[_i_][2]); \
|
|
} \
|
|
} \
|
|
} while(0)
|
|
|
|
#define glamor_set_transformed_point(matrix, xscale, yscale, texcoord, \
|
|
x, y, yInverted) \
|
|
do { \
|
|
float result[4]; \
|
|
int i; \
|
|
float tx, ty; \
|
|
\
|
|
for (i = 0; i < 3; i++) { \
|
|
result[i] = (matrix)[i * 3] * (x) + (matrix)[i * 3 + 1] * (y) \
|
|
+ (matrix)[i * 3 + 2]; \
|
|
} \
|
|
tx = result[0] / result[2]; \
|
|
ty = result[1] / result[2]; \
|
|
\
|
|
(texcoord)[0] = t_from_x_coord_x(xscale, tx); \
|
|
if (yInverted) \
|
|
(texcoord)[1] = t_from_x_coord_y_inverted(yscale, ty); \
|
|
else \
|
|
(texcoord)[1] = t_from_x_coord_y(yscale, ty); \
|
|
} while(0)
|
|
|
|
|
|
#define glamor_set_transformed_normalize_tcoords( matrix, \
|
|
xscale, \
|
|
yscale, \
|
|
tx1, ty1, tx2, ty2, \
|
|
yInverted, texcoords) \
|
|
do { \
|
|
glamor_set_transformed_point(matrix, xscale, yscale, \
|
|
texcoords, tx1, ty1, \
|
|
yInverted); \
|
|
glamor_set_transformed_point(matrix, xscale, yscale, \
|
|
texcoords + 2, tx2, ty1, \
|
|
yInverted); \
|
|
glamor_set_transformed_point(matrix, xscale, yscale, \
|
|
texcoords + 4, tx2, ty2, \
|
|
yInverted); \
|
|
glamor_set_transformed_point(matrix, xscale, yscale, \
|
|
texcoords + 6, tx1, ty2, \
|
|
yInverted); \
|
|
} while (0)
|
|
|
|
#define glamor_set_normalize_tcoords(xscale, yscale, x1, y1, x2, y2, \
|
|
yInverted, vertices) \
|
|
do { \
|
|
(vertices)[0] = t_from_x_coord_x(xscale, x1); \
|
|
(vertices)[2] = t_from_x_coord_x(xscale, x2); \
|
|
(vertices)[4] = (vertices)[2]; \
|
|
(vertices)[6] = (vertices)[0]; \
|
|
if (yInverted) { \
|
|
(vertices)[1] = t_from_x_coord_y_inverted(yscale, y1); \
|
|
(vertices)[5] = t_from_x_coord_y_inverted(yscale, y2); \
|
|
} \
|
|
else { \
|
|
(vertices)[1] = t_from_x_coord_y(yscale, y1); \
|
|
(vertices)[5] = t_from_x_coord_y(yscale, y2); \
|
|
} \
|
|
(vertices)[3] = (vertices)[1]; \
|
|
(vertices)[7] = (vertices)[5]; \
|
|
} while(0)
|
|
|
|
|
|
#define glamor_set_normalize_vcoords(xscale, yscale, x1, y1, x2, y2, \
|
|
yInverted, vertices) \
|
|
do { \
|
|
(vertices)[0] = v_from_x_coord_x(xscale, x1); \
|
|
(vertices)[2] = v_from_x_coord_x(xscale, x2); \
|
|
(vertices)[4] = (vertices)[2]; \
|
|
(vertices)[6] = (vertices)[0]; \
|
|
if (yInverted) { \
|
|
(vertices)[1] = v_from_x_coord_y_inverted(yscale, y1); \
|
|
(vertices)[5] = v_from_x_coord_y_inverted(yscale, y2); \
|
|
} \
|
|
else { \
|
|
(vertices)[1] = v_from_x_coord_y(yscale, y1); \
|
|
(vertices)[5] = v_from_x_coord_y(yscale, y2); \
|
|
} \
|
|
(vertices)[3] = (vertices)[1]; \
|
|
(vertices)[7] = (vertices)[5]; \
|
|
} while(0)
|
|
|
|
|
|
inline static void
|
|
glamor_calculate_boxes_bound(BoxPtr bound, BoxPtr boxes, int nbox)
|
|
{
|
|
int x_min, y_min;
|
|
int x_max, y_max;
|
|
int i;
|
|
x_min = y_min = MAXSHORT;
|
|
x_max = y_max = MINSHORT;
|
|
for(i = 0; i < nbox; i++)
|
|
{
|
|
if (x_min > boxes[i].x1)
|
|
x_min = boxes[i].x1;
|
|
if (y_min > boxes[i].y1)
|
|
x_min = boxes[i].y1;
|
|
|
|
if (x_max < boxes[i].x2)
|
|
x_max = boxes[i].x2;
|
|
if (y_max > boxes[i].y2)
|
|
y_max = boxes[i].y2;
|
|
}
|
|
bound->x1 = x_min;
|
|
bound->y1 = y_min;
|
|
bound->x2 = x_max;
|
|
bound->y2 = y_max;
|
|
}
|
|
|
|
inline static void
|
|
glamor_transform_boxes(BoxPtr boxes, int nbox, int dx, int dy)
|
|
{
|
|
int i;
|
|
for (i = 0; i < nbox; i++)
|
|
{
|
|
boxes[i].x1 += dx;
|
|
boxes[i].y1 += dy;
|
|
boxes[i].x2 += dx;
|
|
boxes[i].y2 += dy;
|
|
}
|
|
}
|
|
#endif
|