2d_engine.c
来自「最新MTK手机软件源码」· C语言 代码 · 共 1,940 行 · 第 1/5 页
C
1,940 行
case G2D_OPERATION_ALPHA_BLENDING:
g2d_alpha_bitblt(g2d_data);
break;
case G2D_OPERATION_FONT_CACHING:
break;
}
}
break;
}
#elif (defined(MT6228)||defined(MT6229)||defined(MT6230))
g2d_data->src_pitch=g2d_data->src_pitch_width;
g2d_data->dest_pitch=g2d_data->dest_pitch_width;
switch (g2d_data->g2d_operation_mode)
{
case G2D_OPERATION_RECTANGLE_FILL:
g2d_rectangle_fill(g2d_data);
break;
case G2D_OPERATION_FONT_CACHING:
g2d_font_caching(g2d_data);
break;
case G2D_OPERATION_LINE_DRAWING:
g2d_line_drawing(g2d_data);
break;
case G2D_OPERATION_CIRCLE_DRWAING:
g2d_circle_drawing(g2d_data);
break;
case G2D_OPERATION_BEZIER_CURVE_DRAWING:
g2d_bezier_curve_drawing(g2d_data);
break;
case G2D_OPERATION_TRIANGLE_FILL:
g2d_triangle_fill(g2d_data);
break;
case G2D_OPERATION_BITBLT:
g2d_bitblt(g2d_data);
break;
case G2D_OPERATION_ALPHA_BLENDING:
g2d_alpha_bitblt(g2d_data);
break;
case G2D_OPERATION_ROP_BITBLT:
g2d_rop_bitblt(g2d_data);
break;
case G2D_OPERATION_H_LINE_FILL:
g2d_line_gradient_drawing(g2d_data);
break;
case G2D_OPERATION_H_LINE_COPY_MASK:
g2d_line_copy_drawing(g2d_data);
break;
}
#endif
#endif
} /* g2d_accelerator() */
/*************************************************************************
* FUNCTION
* g2d_rectangle_fill
*
* DESCRIPTION
* This function execute rectangle fill operation.
*
* PARAMETERS
* g2d_data : the parameter data structure of G2D module
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void g2d_rectangle_fill(g2d_parameter_struct *g2d_data)
{
#ifdef __MTK_TARGET__
#if (defined (MT6219)||defined(MT6226)||defined(MT6226M)||defined(MT6227))
g2d_power_on();
g2d_set_clip_window(g2d_data);
ENABLE_G2D_ENGINE_INT;
if (G2D_ENGINE_IS_BUSY)
{
ENABLE_G2D_CMQ;
while (G2D_CMQ_FREE_SPACE<9)
{};
DRV_WriteReg32(G2D_CMQ_DATA_REG,(G2D_CMQ_DEST_BASE_L_ADDR | (g2d_data->dest_base_address & 0xFFFF)));
DRV_WriteReg32(G2D_CMQ_DATA_REG,(G2D_CMQ_DEST_BASE_H_ADDR | ((g2d_data->dest_base_address>>16) & 0xFFFF)));
DRV_WriteReg32(G2D_CMQ_DATA_REG,(G2D_CMQ_DEST_PITCH_ADDR | g2d_data->dest_pitch));
DRV_WriteReg32(G2D_CMQ_DATA_REG,(G2D_CMQ_DEST_Y_ADDR | g2d_data->dest_y));
DRV_WriteReg32(G2D_CMQ_DATA_REG,(G2D_CMQ_DEST_X_ADDR | g2d_data->dest_x));
DRV_WriteReg32(G2D_CMQ_DATA_REG,(G2D_CMQ_DEST_HEIGHT_ADDR | g2d_data->dest_height));
DRV_WriteReg32(G2D_CMQ_DATA_REG,(G2D_CMQ_DEST_WIDTH_ADDR | g2d_data->dest_width));
DRV_WriteReg32(G2D_CMQ_DATA_REG,(G2D_CMQ_PAT_FG_COLOR_ADDR | g2d_data->pat_fg_color));
if (g2d_data->dest_color_mode==G2D_DEST_16BPP_LUT_DISABLE)
DRV_WriteReg32(G2D_CMQ_DATA_REG,(G2D_CMQ_FIRE_MODE_CTRL_REG_ADDR | FIRE_G2D_RECTANGLE_FILL));
else if (g2d_data->dest_color_mode==G2D_DEST_8BPP_LUT_DISABLE)
DRV_WriteReg32(G2D_CMQ_DATA_REG,(G2D_CMQ_FIRE_MODE_CTRL_REG_ADDR | (FIRE_G2D_RECTANGLE_FILL|FIRE_DEST_COLOR_8BPP_LUT_DIS)));
else
ASSERT(0);
}
else
{
DISABLE_G2D_CMQ;
DRV_WriteReg32(G2D_DEST_BASE_ADDRESS_REG,g2d_data->dest_base_address);
DRV_WriteReg32(G2D_DEST_PITCH_REG,g2d_data->dest_pitch);
DRV_WriteReg32(G2D_DEST_XY_REG,(g2d_data->dest_x<<16)|g2d_data->dest_y);
DRV_WriteReg32(G2D_DEST_WIDTH_HEIGHT_REG,(g2d_data->dest_width<<16) | g2d_data->dest_height);
DRV_WriteReg32(G2D_PAT_FG_COLOR_REG,g2d_data->pat_fg_color);
if (g2d_data->dest_color_mode==G2D_DEST_16BPP_LUT_DISABLE)
{
SET_G2D_RECTANGLE_FILL_DEST_16BPP_LUT_DISABLE;
}
else if (g2d_data->dest_color_mode==G2D_DEST_8BPP_LUT_DISABLE)
{
SET_G2D_RECTANGLE_FILL_DEST_8BPP_LUT_DISABLE;
}
else
ASSERT(0);
}
while (G2D_ENGINE_IS_BUSY) {};
// kal_retrieve_eg_events(g2d_event_id,G2D_COMPLETE_EVENT,KAL_OR_CONSUME,&event_group,KAL_SUSPEND);
g2d_power_off();
#elif (defined(MT6228)||defined(MT6229)||defined(MT6230))
int temp_data;
kal_uint32 temp_mode;
kal_uint16 fire_mode;
g2d_power_on();
RESET_G2D_ENGINE;
g2d_set_clip_window(g2d_data);
if (g2d_data->g2d_cmq_mode==KAL_TRUE)
{
ENABLE_G2D_CMQ;
temp_mode = REG_G2D_SUBMODE_CTRL;
if (g2d_data->color_gradient_mode==G2D_REC_FILL_COLOR_GRAD_ENABLE)
{
while (G2D_CMQ_FREE_SPACE<29){};
ENABLE_G2D_CMQ_WRITE;
temp_data=(int) (g2d_data->alpha_gradient_x*(1<<16));
G2D_WRITE_CMQ((G2D_CMQ_ALPHA_GRAD_X_L_ADDR|(temp_data & 0xFFFF)));
G2D_WRITE_CMQ((G2D_CMQ_ALPHA_GRAD_X_H_ADDR|((temp_data>>16) & 0xFFFF)));
temp_data=(int) (g2d_data->alpha_gradient_y*(1<<16));
G2D_WRITE_CMQ((G2D_CMQ_ALPHA_GRAD_Y_L_ADDR|(temp_data & 0xFFFF)));
G2D_WRITE_CMQ((G2D_CMQ_ALPHA_GRAD_Y_H_ADDR|((temp_data>>16) & 0xFFFF)));
temp_data=(int) (g2d_data->red_gradient_x*(1<<16));
G2D_WRITE_CMQ((G2D_CMQ_RED_GRAD_X_L_ADDR|(temp_data & 0xFFFF)));
G2D_WRITE_CMQ((G2D_CMQ_RED_GRAD_X_H_ADDR|((temp_data>>16) & 0xFFFF)));
temp_data=(int) (g2d_data->red_gradient_y*(1<<16));
G2D_WRITE_CMQ((G2D_CMQ_RED_GRAD_Y_L_ADDR|(temp_data & 0xFFFF)));
G2D_WRITE_CMQ((G2D_CMQ_RED_GRAD_Y_H_ADDR|((temp_data>>16) & 0xFFFF)));
temp_data=(int) (g2d_data->green_gradient_x*(1<<16));
G2D_WRITE_CMQ((G2D_CMQ_GREEN_GRAD_X_L_ADDR|(temp_data & 0xFFFF)));
G2D_WRITE_CMQ((G2D_CMQ_GREEN_GRAD_X_H_ADDR|((temp_data>>16) & 0xFFFF)));
temp_data=(int) (g2d_data->green_gradient_y*(1<<16));
G2D_WRITE_CMQ((G2D_CMQ_GREEN_GRAD_Y_L_ADDR|(temp_data & 0xFFFF)));
G2D_WRITE_CMQ((G2D_CMQ_GREEN_GRAD_Y_H_ADDR|((temp_data>>16) & 0xFFFF)));
temp_data=(int) (g2d_data->blue_gradient_x*(1<<16));
G2D_WRITE_CMQ((G2D_CMQ_BLUE_GRAD_X_L_ADDR|(temp_data & 0xFFFF)));
G2D_WRITE_CMQ((G2D_CMQ_BLUE_GRAD_X_H_ADDR|((temp_data>>16) & 0xFFFF)));
temp_data=(int) (g2d_data->blue_gradient_y*(1<<16));
G2D_WRITE_CMQ((G2D_CMQ_BLUE_GRAD_Y_L_ADDR|(temp_data & 0xFFFF)));
G2D_WRITE_CMQ((G2D_CMQ_BLUE_GRAD_Y_H_ADDR|((temp_data>>16) & 0xFFFF)));
temp_mode |= REG_SUBMODE_CTRL_COLOR_GRADIENT_BIT;
}
else
{
while (G2D_CMQ_FREE_SPACE<13) {};
ENABLE_G2D_CMQ_WRITE;
temp_mode &= ~REG_SUBMODE_CTRL_COLOR_GRADIENT_BIT;
}
if (g2d_data->italic_mode==G2D_REC_FILL_ITALIC_ENABLE)
temp_mode |= REG_SUBMODE_CTRL_ITALIC_BITBLT_BIT;
else
temp_mode &= ~REG_SUBMODE_CTRL_ITALIC_BITBLT_BIT;
G2D_WRITE_CMQ(G2D_CMQ_SUBMODE_CTRL_REG_L_ADDR | (temp_mode & 0xFFFF));
G2D_WRITE_CMQ(G2D_CMQ_SUBMODE_CTRL_REG_H_ADDR | ((temp_mode & 0xFFFF)>>16));
G2D_WRITE_CMQ(G2D_CMQ_DEST_BASE_L_ADDR | (g2d_data->dest_base_address & 0xFFFF));
G2D_WRITE_CMQ(G2D_CMQ_DEST_BASE_H_ADDR | ((g2d_data->dest_base_address>>16) & 0xFFFF));
G2D_WRITE_CMQ(G2D_CMQ_DEST_PITCH_ADDR | g2d_data->dest_pitch);
G2D_WRITE_CMQ(G2D_CMQ_DEST_Y_ADDR | ((kal_uint16) g2d_data->dest_y));
G2D_WRITE_CMQ(G2D_CMQ_DEST_X_ADDR | ((kal_uint16) g2d_data->dest_x));
G2D_WRITE_CMQ(G2D_CMQ_DEST_HEIGHT_ADDR | g2d_data->dest_height);
G2D_WRITE_CMQ(G2D_CMQ_DEST_WIDTH_ADDR | g2d_data->dest_width);
G2D_WRITE_CMQ(G2D_CMQ_PAT_FG_COLOR_L_ADDR | (g2d_data->pat_fg_color&0xFFFF));
G2D_WRITE_CMQ(G2D_CMQ_PAT_FG_COLOR_H_ADDR | ((g2d_data->pat_fg_color&0xFFFF0000)>>16));
temp_mode=REG_G2D_COMM_CTRL;
if (g2d_data->clip_mode ==G2D_CLIP_ENABLE)
{
temp_mode |= REG_COMMON_CTRL_G2D_CLIP_ENABLE_BIT;
}
else
temp_mode &= ~REG_COMMON_CTRL_G2D_CLIP_ENABLE_BIT;
G2D_WRITE_CMQ(G2D_CMQ_2D_COMMON_CTRL_REG_ADDR | ((kal_uint16)temp_mode))
G2D_WRITE_CMQ(G2D_CMQ_FIRE_MODE_CTRL_REG_ADDR |(g2d_data->dest_color_mode)|g2d_data->g2d_operation_mode);
DISABLE_G2D_CMQ_WRITE;
wait_cmq_start();
}
else
{
DISABLE_G2D_CMQ;
SET_BITBLT_DIRECTION(BITBLT_TRANSFORM_DIRECTION_LT_CORNER);
SET_BITBLT_TRANSFORM_MODE(BITBLT_TRANSFORM_COPY);
g2d_set_clip_window(g2d_data);
REG_G2D_DEST_BASE_ADDRESS = g2d_data->dest_base_address;
REG_G2D_DEST_PITCH = g2d_data->dest_pitch_width;
REG_G2D_DEST_XY = (g2d_data->dest_x<<16)|((kal_uint16) g2d_data->dest_y);
REG_G2D_DEST_WIDTH_HEIGHT = (g2d_data->dest_width<<16) | g2d_data->dest_height;
REG_G2D_PAT_FG_COLOR=g2d_data->pat_fg_color;
if (g2d_data->color_gradient_mode==G2D_REC_FILL_COLOR_GRAD_ENABLE)
{
ENABLE_REC_FILL_COLOR_GRADIENT;
REG_G2D_ALPHA_GRADIENT_X = (int) (g2d_data->alpha_gradient_x*(1<<16));
REG_G2D_ALPHA_GRADIENT_Y = (int) (g2d_data->alpha_gradient_y*(1<<16));
REG_G2D_RED_GRADIENT_X = (int) (g2d_data->red_gradient_x*(1<<16));
REG_G2D_RED_GRADIENT_Y = (int) (g2d_data->red_gradient_y*(1<<16));
REG_G2D_GREEN_GRADIENT_X = (int) (g2d_data->green_gradient_x*(1<<16));
REG_G2D_GREEN_GRADIENT_Y = (int) (g2d_data->green_gradient_y*(1<<16));
REG_G2D_BLUE_GRADIENT_X = (int) (g2d_data->blue_gradient_x*(1<<16));
REG_G2D_BLUE_GRADIENT_Y = (int) (g2d_data->blue_gradient_y*(1<<16));
}
else
{
DISABLE_REC_FILL_COLOR_GRADIENT;
}
if (g2d_data->italic_mode==G2D_REC_FILL_ITALIC_ENABLE)
{
ENABLE_G2D_BITBLT_ITALIC_MODE;
}
else
{
DISABLE_G2D_BITBLT_ITALIC_MODE;
}
if (g2d_data->clip_mode ==G2D_CLIP_ENABLE)
{
ENABLE_G2D_ENGINE_CLIP;
}
else
{
DISABLE_G2D_ENGINE_CLIP
}
fire_mode=(g2d_data->dest_color_mode)|g2d_data->g2d_operation_mode;
ENABLE_G2D_ENGINE_INT;
REG_G2D_FIRE_CTRL=fire_mode;
}
while (G2D_ENGINE_IS_BUSY) {};
g2d_power_off();
#endif
#endif
} /* g2d_rectangle_fill() */
#if (defined(MT6228)||defined(MT6229)||defined(MT6230))
kal_uint8 g2d_bitblt_direction(g2d_parameter_struct *g2d_data)
{
kal_uint32 src_start_address,src_end_address;
kal_uint32 dest_start_address,dest_end_address;
if (g2d_data->src_pitch!=g2d_data->dest_pitch)
{
; /* assert due to the different pitch of source and destination */
}
src_start_address=g2d_data->src_base_address;
src_end_address=src_start_address+g2d_data->src_pitch * g2d_data->end_y;
dest_start_address=g2d_data->dest_base_address;
dest_end_address=dest_start_address + g2d_data->dest_pitch * g2d_data->end_y;
if ((src_start_address<dest_end_address)||(src_end_address>dest_start_address))
return BITBLT_TRANSFORM_DIRECTION_LT_CORNER;
if (dest_start_address>src_end_address)
return BITBLT_TRANSFORM_DIRECTION_RB_CORNER;
return BITBLT_TRANSFORM_DIRECTION_LT_CORNER;
} /* g2d_bitblt_direction() */
#endif
/*************************************************************************
* FUNCTION
* g2d_bitblt
*
* DESCRIPTION
* This function execute bitblt operation.
*
* PARAMETERS
* g2d_data : the parameter data structure of G2D module
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void g2d_bitblt(g2d_parameter_struct *g2d_data)
{
#ifdef __MTK_TARGET__
#if (defined (MT6219)||defined(MT6226)||defined(MT6226M)||defined(MT6227))
kal_uint16 temp_mode;
// kal_uint32 event_group;
g2d_power_on();
switch (g2d_data->bitblt_mode)
{
case BITBLT_TRANSFORM_MIRROR_ROTATE_90:
case BITBLT_TRANSFORM_ROTATE_90:
case BITBLT_TRANSFORM_ROTATE_270:
case BITBLT_TRANSFORM_MIRROR_ROTATE_270:
if ((g2d_data->dest_width!=g2d_data->src_height)||(g2d_data->dest_height!=g2d_data->src_width))
ASSERT(0);
break;
case BITBLT_TRANSFORM_ROTATE_180:
case BITBLT_TRANSFORM_MIRROR:
case BITBLT_TRANSFORM_MIRROR_ROTATE_180:
if ((g2d_data->dest_width!=g2d_data->src_width)||(g2d_data->dest_height!=g2d_data->src_height))
ASSERT(0);
break;
case BITBLT_TRANSFORM_COPY:
break;
default:
ASSERT(0);
break;
}
g2d_set_clip_window(g2d_data);
ENABLE_G2D_ENGINE_INT;
if (G2D_ENGINE_IS_BUSY)
{
ENABLE_G2D_CMQ;
while (G2D_CMQ_FREE_SPACE<18)
{};
DRV_WriteReg32(G2D_CMQ_DATA_REG,(G2D_CMQ_SRC_BASE_L_ADDR | (g2d_data->src_base_address & 0xFFFF)));
DRV_WriteReg32(G2D_CMQ_DATA_REG,(G2D_CMQ_SRC_BASE_H_ADDR | ((g2d_data->src_base_address>>16) & 0xFFFF)));
DRV_WriteReg32(G2D_CMQ_DATA_REG,(G2D_CMQ_DEST_BASE_L_ADDR | (g2d_data->dest_base_address & 0xFFFF)));
DRV_WriteReg32(G2D_CMQ_DATA_REG,(G2D_CMQ_DEST_BASE_H_ADDR | ((g2d_data->dest_base_address>>16) & 0xFFFF)));
DRV_WriteReg32(G2D_CMQ_DATA_REG,(G2D_CMQ_SRC_PITCH_ADDR | g2d_data->src_pitch));
DRV_WriteReg32(G2D_CMQ_DATA_REG,(G2D_CMQ_DEST_PITCH_ADDR | g2d_data->dest_pitch));
DRV_WriteReg32(G2D_CMQ_DATA_REG,(G2D_CMQ_SRC_Y_ADDR | g2d_data->src_y));
DRV_WriteReg32(G2D_CMQ_DATA_REG,(G2D_CMQ_SRC_X_ADDR | g2d_data->src_x));
DRV_WriteReg32(G2D_CMQ_DATA_REG,(G2D_CMQ_SRC_HEIGHT_ADDR | g2d_data->src_height));
DRV_WriteReg32(G2D_CMQ_DATA_REG,(G2D_CMQ_SRC_WIDTH_ADDR | g2d_data->src_width));
DRV_WriteReg32(G2D_CMQ_DATA_REG,(G2D_CMQ_DEST_HEIGHT_ADDR | g2d_data->dest_height));
DRV_WriteReg32(G2D_CMQ_DATA_REG,(G2D_CMQ_DEST_WIDTH_ADDR | g2d_data->dest_width));
switch (g2d_data->bitblt_mode)
{
case BITBLT_TRANSFORM_MIRROR_ROTATE_90:
DRV_WriteReg32(G2D_CMQ_DATA_REG,(G2D_CMQ_DEST_Y_ADDR | (g2d_data->dest_y+g2d_data->dest_height-1)));
DRV_WriteReg32(G2D_CMQ_DATA_REG,(G2D_CMQ_DEST_X_ADDR | (g2d_data->dest_x+g2d_data->dest_width-1)));
break;
case BITBLT_TRANSFORM_ROTATE_90:
DRV_WriteReg32(G2D_CMQ_DATA_REG,(G2D_CMQ_DEST_Y_ADDR | g2d_data->dest_y));
DRV_WriteReg32(G2D_CMQ_DATA_REG,(G2D_CMQ_DEST_X_ADDR | (g2d_data->dest_x+g2d_data->dest_width-1)));
break;
case BITBLT_TRANSFORM_ROTATE_270:
DRV_WriteReg32(G2D_CMQ_DATA_REG,(G2D_CMQ_DEST_Y_ADDR | (g2d_data->dest_y+g2d_data->dest_height-1)));
DRV_WriteReg32(G2D_CMQ_DATA_REG,(G2D_CMQ_DEST_X_ADDR | g2d_data->dest_x));
break;
case BITBLT_TRANSFORM_MIRROR_ROTATE_270:
case BITBLT_TRANSFORM_COPY:
DRV_WriteReg32(G2D_CMQ_DATA_REG,(G2D_CMQ_DEST_Y_ADDR | g2d_data->dest_y));
DRV_WriteReg32(G2D_CMQ_DATA_REG,(G2D_CMQ_DEST_X_ADDR | g2d_data->dest_x));
break;
case BITBLT_TRANSFORM_ROTATE_180:
DRV_WriteReg32(G2D_CMQ_DATA_REG,(G2D_CMQ_DEST_Y_ADDR | (g2d_data->dest_y+g2d_data->dest_height-1)));
DRV_WriteReg32(G2D_CMQ_DATA_REG,(G2D_CMQ_DEST_X_ADDR | (g2d_data->dest_x+g2d_data->dest_width-1)));
break;
case BITBLT_TRANSFORM_MIRROR:
DRV_WriteReg32(G2D_CMQ_DATA_REG,(G2D_CMQ_DEST_Y_ADDR | g2d_data->dest_y));
DRV_WriteReg32(G2D_CMQ_DATA_REG,(G2D_CMQ_DEST_X_ADDR | (g2d_data->dest_x+g2d_data->dest_width-1)));
break;
case BITBLT_TRANSFORM_MIRROR_ROTATE_180:
DRV_WriteReg32(G2D_CMQ_DATA_REG,(G2D_CMQ_DEST_Y_ADDR | (g2d_data->dest_y+g2d_data->dest_height-1)));
DRV_WriteReg32(G2D_CMQ_DATA_REG,(G2D_CMQ_DEST_X_ADDR | g2d_data->dest_x));
break;
default:
ASSERT(0);
break;
}
temp_mode=DRV_Reg32(G2D_SUBMODE_CTRL_REG);
temp_mode &= ~REG_SUBMODE_CTRL_BITBLT_TRANSFORM_MASK;
temp_mode |= g2d_data->bitblt_mode;
if (g2d_data->src_key_mode==G2D_SRC_KEY_ENABLE)
{
temp_mode |= REG_SUBMODE_CTRL_BITBLT_TRANSPARENT_BIT;
DRV_WriteReg32(G2D_CMQ_DATA_REG,(G2D_CMQ_SRCKEY_COLOR_ADDR|g2d_data->src_key_color));
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?