diff --git a/core/hw/pvr/pvr_mem.cpp b/core/hw/pvr/pvr_mem.cpp index 9b9a7c24e..eb3908bef 100644 --- a/core/hw/pvr/pvr_mem.cpp +++ b/core/hw/pvr/pvr_mem.cpp @@ -37,9 +37,9 @@ void YUV_init() YUV_dest=TA_YUV_TEX_BASE&VRAM_MASK;//TODO : add the masking needed TA_YUV_TEX_CNT=0; - YUV_blockcount=(((TA_YUV_TEX_CTRL>>0)&0x3F)+1)*(((TA_YUV_TEX_CTRL>>8)&0x3F)+1); + YUV_blockcount = (TA_YUV_TEX_CTRL.yuv_u_size + 1) * (TA_YUV_TEX_CTRL.yuv_v_size + 1); - if ((TA_YUV_TEX_CTRL>>16 )&1) + if (TA_YUV_TEX_CTRL.yuv_tex != 0) { die ("YUV: Not supported configuration\n"); YUV_x_size=16; @@ -47,8 +47,8 @@ void YUV_init() } else // yesh!!! { - YUV_x_size=(((TA_YUV_TEX_CTRL>>0)&0x3F)+1)*16; - YUV_y_size=(((TA_YUV_TEX_CTRL>>8)&0x3F)+1)*16; + YUV_x_size = (TA_YUV_TEX_CTRL.yuv_u_size + 1) * 16; + YUV_y_size = (TA_YUV_TEX_CTRL.yuv_v_size + 1) * 16; } } @@ -164,7 +164,7 @@ void YUV_data(u32* data , u32 count) YUV_init(); } - u32 block_size=(TA_YUV_TEX_CTRL & (1<<24))==0?384:512; + u32 block_size = TA_YUV_TEX_CTRL.yuv_form == 0 ? 384 : 512; verify(block_size==384); //no support for 512 diff --git a/core/hw/pvr/pvr_regs.h b/core/hw/pvr/pvr_regs.h index 93969c8bc..42bd5eadc 100644 --- a/core/hw/pvr/pvr_regs.h +++ b/core/hw/pvr/pvr_regs.h @@ -371,6 +371,21 @@ union TA_GLOB_TILE_CLIP_type u32 full; }; +union TA_YUV_TEX_CTRL_type +{ + struct + { + u32 yuv_u_size : 6; + u32 reserved1 : 2; + u32 yuv_v_size : 6; + u32 reserved2 : 2; + u32 yuv_tex : 1; + u32 reserved3 : 7; + u32 yuv_form : 1; + u32 reserved4 : 7; + }; + u32 full; +}; // TA REGS #define TA_OL_BASE_addr 0x00000124 // RW Object list write start address @@ -483,7 +498,7 @@ union TA_GLOB_TILE_CLIP_type #define TA_ALLOC_CTRL PvrReg(TA_ALLOC_CTRL_addr,u32) // RW Object list control #define TA_LIST_INIT PvrReg(TA_LIST_INIT_addr,u32) // RW TA initialization #define TA_YUV_TEX_BASE PvrReg(TA_YUV_TEX_BASE_addr,u32) // RW YUV422 texture write start address -#define TA_YUV_TEX_CTRL PvrReg(TA_YUV_TEX_CTRL_addr,u32) // RW YUV converter control +#define TA_YUV_TEX_CTRL PvrReg(TA_YUV_TEX_CTRL_addr, TA_YUV_TEX_CTRL_type) // RW YUV converter control #define TA_YUV_TEX_CNT PvrReg(TA_YUV_TEX_CNT_addr,u32) // R YUV converter macro block counter value #define TA_LIST_CONT PvrReg(TA_LIST_CONT_addr,u32) // RW TA continuation processing