X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=plugins%2Fgpu_unai%2Fgpulib_if.cpp;h=45c73a737777802d2799676a12edaaeb7efffd4e;hb=c296224f47ceebab4d6fbd071959bff294e80293;hp=960ad89d000d7ae677fcd60213c8eeb5cba1a15d;hpb=36da9c1305e300fce0d41236bae4533851d490d3;p=pcsx_rearmed.git diff --git a/plugins/gpu_unai/gpulib_if.cpp b/plugins/gpu_unai/gpulib_if.cpp index 960ad89d..45c73a73 100644 --- a/plugins/gpu_unai/gpulib_if.cpp +++ b/plugins/gpu_unai/gpulib_if.cpp @@ -70,7 +70,7 @@ #define DOWNSCALE_VRAM_SIZE (1024 * 512 * 2 * 2 + 4096) -INLINE void scale_640_to_320(uint16_t *dest, const le16_t *src, bool isRGB24) { +INLINE void scale_640_to_320(le16_t *dest, const le16_t *src, bool isRGB24) { size_t uCount = 320; if(isRGB24) { @@ -84,17 +84,17 @@ INLINE void scale_640_to_320(uint16_t *dest, const le16_t *src, bool isRGB24) { src8 += 4; } while(--uCount); } else { - const le16_t *src16 = src; - uint16_t* dst16 = dest; + const le16_t* src16 = src; + le16_t* dst16 = dest; do { - *dst16++ = le16_to_u16(*src16); + *dst16++ = *src16; src16 += 2; } while(--uCount); } } -INLINE void scale_512_to_320(uint16_t *dest, const le16_t *src, bool isRGB24) { +INLINE void scale_512_to_320(le16_t *dest, const le16_t *src, bool isRGB24) { size_t uCount = 64; if(isRGB24) { @@ -123,16 +123,16 @@ INLINE void scale_512_to_320(uint16_t *dest, const le16_t *src, bool isRGB24) { } while(--uCount); } else { const le16_t* src16 = src; - uint16_t* dst16 = dest; + le16_t* dst16 = dest; do { - *dst16++ = le16_to_u16(*src16++); - *dst16++ = le16_to_u16(*src16); + *dst16++ = *src16++; + *dst16++ = *src16; src16 += 2; - *dst16++ = le16_to_u16(*src16++); - *dst16++ = le16_to_u16(*src16); + *dst16++ = *src16++; + *dst16++ = *src16; src16 += 2; - *dst16++ = le16_to_u16(*src16); + *dst16++ = *src16; src16 += 2; } while(--uCount); } @@ -140,7 +140,7 @@ INLINE void scale_512_to_320(uint16_t *dest, const le16_t *src, bool isRGB24) { static uint16_t *get_downscale_buffer(int *x, int *y, int *w, int *h, int *vram_h) { - uint16_t *dest = gpu_unai.downscale_vram; + le16_t *dest = gpu_unai.downscale_vram; const le16_t *src = gpu_unai.vram; bool isRGB24 = (gpu_unai.GPU_GP1 & 0x00200000 ? true : false); int stride = 1024, dstride = 1024, lines = *h, orig_w = *w; @@ -184,19 +184,14 @@ static uint16_t *get_downscale_buffer(int *x, int *y, int *w, int *h, int *vram_ size_t size = isRGB24 ? *w * 3 : *w * 2; do { -#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ - for (unsigned int i; i < size; i += 2) - dest[fb_offset_dest + i] = le16_to_u16(src[fb_offset_src + i]); -#else - memcpy(dest + fb_offset_dest, (u16 *)src + fb_offset_src, size); -#endif + memcpy(dest + fb_offset_dest, src + fb_offset_src, size); fb_offset_src = (fb_offset_src + stride) & fb_mask; fb_offset_dest = (fb_offset_dest + dstride) & fb_mask; } while(--lines); break; } - return gpu_unai.downscale_vram; + return (uint16_t *)gpu_unai.downscale_vram; } static void map_downscale_buffer(void) @@ -204,7 +199,7 @@ static void map_downscale_buffer(void) if (gpu_unai.downscale_vram) return; - gpu_unai.downscale_vram = (uint16_t*)gpu.mmap(DOWNSCALE_VRAM_SIZE); + gpu_unai.downscale_vram = (le16_t*)gpu.mmap(DOWNSCALE_VRAM_SIZE); if (gpu_unai.downscale_vram == NULL) { fprintf(stderr, "failed to map downscale buffer\n"); @@ -322,7 +317,7 @@ void renderer_notify_res_change(void) */ } -void renderer_notify_scanout_x_change(int x, int w) +void renderer_notify_scanout_change(int x, int y) { } @@ -395,14 +390,16 @@ static void gpuGP0Cmd_0xEx(gpu_unai_t &gpu_unai, u32 cmd_word) } #endif +#include "../gpulib/gpu_timing.h" extern const unsigned char cmd_lengths[256]; -int do_cmd_list(u32 *_list, int list_len, int *last_cmd) +int do_cmd_list(u32 *_list, int list_len, int *cpu_cycles_out, int *last_cmd) { u32 cmd = 0, len, i; le32_t *list = (le32_t *)_list; le32_t *list_start = list; le32_t *list_end = list + list_len; + u32 cpu_cycles = 0; //TODO: set ilace_mask when resolution changes instead of every time, // eliminate #ifdef below. @@ -435,6 +432,8 @@ int do_cmd_list(u32 *_list, int list_len, int *last_cmd) { case 0x02: gpuClearImage(packet); + cpu_cycles += gput_fill(le16_to_s16(packet.U2[4]) & 0x3ff, + le16_to_s16(packet.U2[5]) & 0x1ff); break; case 0x20: @@ -447,6 +446,7 @@ int do_cmd_list(u32 *_list, int list_len, int *last_cmd) gpu_unai.Masking | Blending | gpu_unai.PixelMSB ]; gpuDrawPolyF(packet, driver, false); + cpu_cycles += gput_poly_base(); } break; case 0x24: @@ -471,6 +471,7 @@ int do_cmd_list(u32 *_list, int list_len, int *last_cmd) PP driver = gpuPolySpanDrivers[driver_idx]; gpuDrawPolyFT(packet, driver, false); + cpu_cycles += gput_poly_base_t(); } break; case 0x28: @@ -483,6 +484,7 @@ int do_cmd_list(u32 *_list, int list_len, int *last_cmd) gpu_unai.Masking | Blending | gpu_unai.PixelMSB ]; gpuDrawPolyF(packet, driver, true); // is_quad = true + cpu_cycles += gput_quad_base(); } break; case 0x2C: @@ -507,6 +509,7 @@ int do_cmd_list(u32 *_list, int list_len, int *last_cmd) PP driver = gpuPolySpanDrivers[driver_idx]; gpuDrawPolyFT(packet, driver, true); // is_quad = true + cpu_cycles += gput_quad_base_t(); } break; case 0x30: @@ -524,6 +527,7 @@ int do_cmd_list(u32 *_list, int list_len, int *last_cmd) gpu_unai.Masking | Blending | 129 | gpu_unai.PixelMSB ]; gpuDrawPolyG(packet, driver, false); + cpu_cycles += gput_poly_base_g(); } break; case 0x34: @@ -539,6 +543,7 @@ int do_cmd_list(u32 *_list, int list_len, int *last_cmd) gpu_unai.Masking | Blending | ((Lighting)?129:0) | gpu_unai.PixelMSB ]; gpuDrawPolyGT(packet, driver, false); + cpu_cycles += gput_poly_base_gt(); } break; case 0x38: @@ -553,6 +558,7 @@ int do_cmd_list(u32 *_list, int list_len, int *last_cmd) gpu_unai.Masking | Blending | 129 | gpu_unai.PixelMSB ]; gpuDrawPolyG(packet, driver, true); // is_quad = true + cpu_cycles += gput_quad_base_g(); } break; case 0x3C: @@ -568,6 +574,7 @@ int do_cmd_list(u32 *_list, int list_len, int *last_cmd) gpu_unai.Masking | Blending | ((Lighting)?129:0) | gpu_unai.PixelMSB ]; gpuDrawPolyGT(packet, driver, true); // is_quad = true + cpu_cycles += gput_quad_base_gt(); } break; case 0x40: @@ -578,6 +585,7 @@ int do_cmd_list(u32 *_list, int list_len, int *last_cmd) u32 driver_idx = (Blending_Mode | gpu_unai.Masking | Blending | (gpu_unai.PixelMSB>>3)) >> 1; PSD driver = gpuPixelSpanDrivers[driver_idx]; gpuDrawLineF(packet, driver); + cpu_cycles += gput_line(0); } break; case 0x48 ... 0x4F: { // Monochrome line strip @@ -594,6 +602,7 @@ int do_cmd_list(u32 *_list, int list_len, int *last_cmd) gpu_unai.PacketBuffer.U4[1] = gpu_unai.PacketBuffer.U4[2]; gpu_unai.PacketBuffer.U4[2] = *list_position++; gpuDrawLineF(packet, driver); + cpu_cycles += gput_line(0); num_vertexes++; if(list_position >= list_end) { @@ -617,6 +626,7 @@ int do_cmd_list(u32 *_list, int list_len, int *last_cmd) driver_idx |= (1 << 5); PSD driver = gpuPixelSpanDrivers[driver_idx]; gpuDrawLineG(packet, driver); + cpu_cycles += gput_line(0); } break; case 0x58 ... 0x5F: { // Gouraud-shaded line strip @@ -637,6 +647,7 @@ int do_cmd_list(u32 *_list, int list_len, int *last_cmd) gpu_unai.PacketBuffer.U4[2] = *list_position++; gpu_unai.PacketBuffer.U4[3] = *list_position++; gpuDrawLineG(packet, driver); + cpu_cycles += gput_line(0); num_vertexes++; if(list_position >= list_end) { @@ -655,7 +666,9 @@ int do_cmd_list(u32 *_list, int list_len, int *last_cmd) case 0x62: case 0x63: { // Monochrome rectangle (variable size) PT driver = gpuTileSpanDrivers[(Blending_Mode | gpu_unai.Masking | Blending | (gpu_unai.PixelMSB>>3)) >> 1]; - gpuDrawT(packet, driver); + s32 w = 0, h = 0; + gpuDrawT(packet, driver, &w, &h); + cpu_cycles += gput_sprite(w, h); } break; case 0x64: @@ -664,6 +677,7 @@ int do_cmd_list(u32 *_list, int list_len, int *last_cmd) case 0x67: { // Textured rectangle (variable size) gpuSetCLUT (le32_to_u32(gpu_unai.PacketBuffer.U4[2]) >> 16); u32 driver_idx = Blending_Mode | gpu_unai.TEXT_MODE | gpu_unai.Masking | Blending | (gpu_unai.PixelMSB>>1); + s32 w = 0, h = 0; //senquack - Only color 808080h-878787h allows skipping lighting calculation: // This fixes Silent Hill running animation on loading screens: @@ -682,7 +696,8 @@ int do_cmd_list(u32 *_list, int list_len, int *last_cmd) if ((le32_raw(gpu_unai.PacketBuffer.U4[0]) & HTOLE32(0xF8F8F8)) != HTOLE32(0x808080)) driver_idx |= Lighting; PS driver = gpuSpriteSpanDrivers[driver_idx]; - gpuDrawS(packet, driver); + gpuDrawS(packet, driver, &w, &h); + cpu_cycles += gput_sprite(w, h); } break; case 0x68: @@ -691,7 +706,9 @@ int do_cmd_list(u32 *_list, int list_len, int *last_cmd) case 0x6B: { // Monochrome rectangle (1x1 dot) gpu_unai.PacketBuffer.U4[2] = u32_to_le32(0x00010001); PT driver = gpuTileSpanDrivers[(Blending_Mode | gpu_unai.Masking | Blending | (gpu_unai.PixelMSB>>3)) >> 1]; - gpuDrawT(packet, driver); + s32 w = 0, h = 0; + gpuDrawT(packet, driver, &w, &h); + cpu_cycles += gput_sprite(1, 1); } break; case 0x70: @@ -700,7 +717,9 @@ int do_cmd_list(u32 *_list, int list_len, int *last_cmd) case 0x73: { // Monochrome rectangle (8x8) gpu_unai.PacketBuffer.U4[2] = u32_to_le32(0x00080008); PT driver = gpuTileSpanDrivers[(Blending_Mode | gpu_unai.Masking | Blending | (gpu_unai.PixelMSB>>3)) >> 1]; - gpuDrawT(packet, driver); + s32 w = 0, h = 0; + gpuDrawT(packet, driver, &w, &h); + cpu_cycles += gput_sprite(w, h); } break; case 0x74: @@ -710,6 +729,7 @@ int do_cmd_list(u32 *_list, int list_len, int *last_cmd) gpu_unai.PacketBuffer.U4[3] = u32_to_le32(0x00080008); gpuSetCLUT (le32_to_u32(gpu_unai.PacketBuffer.U4[2]) >> 16); u32 driver_idx = Blending_Mode | gpu_unai.TEXT_MODE | gpu_unai.Masking | Blending | (gpu_unai.PixelMSB>>1); + s32 w = 0, h = 0; //senquack - Only color 808080h-878787h allows skipping lighting calculation: //if ((gpu_unai.PacketBuffer.U1[0]>0x5F) && (gpu_unai.PacketBuffer.U1[1]>0x5F) && (gpu_unai.PacketBuffer.U1[2]>0x5F)) @@ -717,7 +737,8 @@ int do_cmd_list(u32 *_list, int list_len, int *last_cmd) if ((le32_raw(gpu_unai.PacketBuffer.U4[0]) & HTOLE32(0xF8F8F8)) != HTOLE32(0x808080)) driver_idx |= Lighting; PS driver = gpuSpriteSpanDrivers[driver_idx]; - gpuDrawS(packet, driver); + gpuDrawS(packet, driver, &w, &h); + cpu_cycles += gput_sprite(w, h); } break; case 0x78: @@ -726,7 +747,9 @@ int do_cmd_list(u32 *_list, int list_len, int *last_cmd) case 0x7B: { // Monochrome rectangle (16x16) gpu_unai.PacketBuffer.U4[2] = u32_to_le32(0x00100010); PT driver = gpuTileSpanDrivers[(Blending_Mode | gpu_unai.Masking | Blending | (gpu_unai.PixelMSB>>3)) >> 1]; - gpuDrawT(packet, driver); + s32 w = 0, h = 0; + gpuDrawT(packet, driver, &w, &h); + cpu_cycles += gput_sprite(w, h); } break; case 0x7C: @@ -734,8 +757,10 @@ int do_cmd_list(u32 *_list, int list_len, int *last_cmd) #ifdef __arm__ if ((gpu_unai.GPU_GP1 & 0x180) == 0 && (gpu_unai.Masking | gpu_unai.PixelMSB) == 0) { - gpuSetCLUT (le32_to_u32(gpu_unai.PacketBuffer.U4[2]) >> 16); - gpuDrawS16(packet); + s32 w = 0, h = 0; + gpuSetCLUT(le32_to_u32(gpu_unai.PacketBuffer.U4[2]) >> 16); + gpuDrawS16(packet, &w, &h); + cpu_cycles += gput_sprite(w, h); break; } // fallthrough @@ -745,13 +770,15 @@ int do_cmd_list(u32 *_list, int list_len, int *last_cmd) gpu_unai.PacketBuffer.U4[3] = u32_to_le32(0x00100010); gpuSetCLUT (le32_to_u32(gpu_unai.PacketBuffer.U4[2]) >> 16); u32 driver_idx = Blending_Mode | gpu_unai.TEXT_MODE | gpu_unai.Masking | Blending | (gpu_unai.PixelMSB>>1); + s32 w = 0, h = 0; //senquack - Only color 808080h-878787h allows skipping lighting calculation: //if ((gpu_unai.PacketBuffer.U1[0]>0x5F) && (gpu_unai.PacketBuffer.U1[1]>0x5F) && (gpu_unai.PacketBuffer.U1[2]>0x5F)) // Strip lower 3 bits of each color and determine if lighting should be used: if ((le32_raw(gpu_unai.PacketBuffer.U4[0]) & HTOLE32(0xF8F8F8)) != HTOLE32(0x808080)) driver_idx |= Lighting; PS driver = gpuSpriteSpanDrivers[driver_idx]; - gpuDrawS(packet, driver); + gpuDrawS(packet, driver, &w, &h); + cpu_cycles += gput_sprite(w, h); } break; #ifdef TEST @@ -771,6 +798,7 @@ int do_cmd_list(u32 *_list, int list_len, int *last_cmd) case 0xC0: break; #else + case 0x1F: // irq? case 0x80 ... 0x9F: // vid -> vid case 0xA0 ... 0xBF: // sys -> vid case 0xC0 ... 0xDF: // vid -> sys @@ -787,6 +815,7 @@ breakloop: gpu.ex_regs[1] &= ~0x1ff; gpu.ex_regs[1] |= gpu_unai.GPU_GP1 & 0x1ff; + *cpu_cycles_out += cpu_cycles; *last_cmd = cmd; return list - list_start; } @@ -794,7 +823,7 @@ breakloop: void renderer_sync_ecmds(u32 *ecmds) { int dummy; - do_cmd_list(&ecmds[1], 6, &dummy); + do_cmd_list(&ecmds[1], 6, &dummy, &dummy); } void renderer_update_caches(int x, int y, int w, int h, int state_changed)