From 27e9acaac602be9d8417ec8274b946dfcd967148 Mon Sep 17 00:00:00 2001 From: Flyinghead Date: Sat, 5 Oct 2019 16:06:07 +0200 Subject: [PATCH] rend: refactor ReadFramebuffer() out of gles --- core/rend/TexCache.cpp | 123 +++++++++++++++++++++++++++++++++++++++ core/rend/TexCache.h | 2 + core/rend/gles/gltex.cpp | 122 ++------------------------------------ 3 files changed, 129 insertions(+), 118 deletions(-) diff --git a/core/rend/TexCache.cpp b/core/rend/TexCache.cpp index 4efceb565..e5c7fd43a 100644 --- a/core/rend/TexCache.cpp +++ b/core/rend/TexCache.cpp @@ -6,6 +6,7 @@ #include "TexCache.h" #include "hw/pvr/pvr_regs.h" +#include "hw/pvr/pvr_mem.h" #include "hw/pvr/Renderer_if.h" #include "hw/mem/_vmem.h" #include "hw/mem/vmem32.h" @@ -806,3 +807,125 @@ void killtex() KillTex = false; INFO_LOG(RENDERER, "Texture cache cleared"); } + +void ReadFramebuffer(PixelBuffer& pb, int& width, int& height) +{ + width = (FB_R_SIZE.fb_x_size + 1) << 1; // in 16-bit words + height = FB_R_SIZE.fb_y_size + 1; + int modulus = (FB_R_SIZE.fb_modulus - 1) << 1; + + int bpp; + switch (FB_R_CTRL.fb_depth) + { + case fbde_0555: + case fbde_565: + bpp = 2; + break; + case fbde_888: + bpp = 3; + width = (width * 2) / 3; // in pixels + modulus = (modulus * 2) / 3; // in pixels + break; + case fbde_C888: + bpp = 4; + width /= 2; // in pixels + modulus /= 2; // in pixels + break; + default: + die("Invalid framebuffer format\n"); + bpp = 4; + break; + } + + u32 addr = SPG_CONTROL.interlace && !SPG_STATUS.fieldnum ? FB_R_SOF2 : FB_R_SOF1; + + pb.init(width, height); + u8 *dst = (u8*)pb.data(); + + switch (FB_R_CTRL.fb_depth) + { + case fbde_0555: // 555 RGB + for (int y = 0; y < height; y++) + { + for (int i = 0; i < width; i++) + { + u16 src = pvr_read_area1_16(addr); + *dst++ = (((src >> 10) & 0x1F) << 3) + FB_R_CTRL.fb_concat; + *dst++ = (((src >> 5) & 0x1F) << 3) + FB_R_CTRL.fb_concat; + *dst++ = (((src >> 0) & 0x1F) << 3) + FB_R_CTRL.fb_concat; + *dst++ = 0xFF; + addr += bpp; + } + addr += modulus * bpp; + } + break; + + case fbde_565: // 565 RGB + for (int y = 0; y < height; y++) + { + for (int i = 0; i < width; i++) + { + u16 src = pvr_read_area1_16(addr); + *dst++ = (((src >> 11) & 0x1F) << 3) + FB_R_CTRL.fb_concat; + *dst++ = (((src >> 5) & 0x3F) << 2) + (FB_R_CTRL.fb_concat >> 1); + *dst++ = (((src >> 0) & 0x1F) << 3) + FB_R_CTRL.fb_concat; + *dst++ = 0xFF; + addr += bpp; + } + addr += modulus * bpp; + } + break; + case fbde_888: // 888 RGB + for (int y = 0; y < height; y++) + { + for (int i = 0; i < width; i += 4) + { + u32 src = pvr_read_area1_32(addr); + *dst++ = src >> 16; + *dst++ = src >> 8; + *dst++ = src; + *dst++ = 0xFF; + addr += 4; + if (i + 1 >= width) + break; + u32 src2 = pvr_read_area1_32(addr); + *dst++ = src2 >> 8; + *dst++ = src2; + *dst++ = src >> 24; + *dst++ = 0xFF; + addr += 4; + if (i + 2 >= width) + break; + u32 src3 = pvr_read_area1_32(addr); + *dst++ = src3; + *dst++ = src2 >> 24; + *dst++ = src2 >> 16; + *dst++ = 0xFF; + addr += 4; + if (i + 3 >= width) + break; + *dst++ = src3 >> 24; + *dst++ = src3 >> 16; + *dst++ = src3 >> 8; + *dst++ = 0xFF; + } + addr += modulus * bpp; + } + break; + case fbde_C888: // 0888 RGB + for (int y = 0; y < height; y++) + { + for (int i = 0; i < width; i++) + { + u32 src = pvr_read_area1_32(addr); + *dst++ = src >> 16; + *dst++ = src >> 8; + *dst++ = src; + *dst++ = 0xFF; + addr += bpp; + } + addr += modulus * bpp; + } + break; + } +} diff --git a/core/rend/TexCache.h b/core/rend/TexCache.h index c876aed0c..019d13dd7 100644 --- a/core/rend/TexCache.h +++ b/core/rend/TexCache.h @@ -703,3 +703,5 @@ struct BaseTextureCacheData BaseTextureCacheData *getTextureCacheData(TSP tsp, TCW tcw, BaseTextureCacheData *(*factory)()); void CollectCleanup(); void killtex(); + +void ReadFramebuffer(PixelBuffer& pb, int& width, int& height); diff --git a/core/rend/gles/gltex.cpp b/core/rend/gles/gltex.cpp index 86492f9b8..15368243c 100644 --- a/core/rend/gles/gltex.cpp +++ b/core/rend/gles/gltex.cpp @@ -449,32 +449,10 @@ void RenderFramebuffer() if (FB_R_SIZE.fb_x_size == 0 || FB_R_SIZE.fb_y_size == 0) return; - int width = (FB_R_SIZE.fb_x_size + 1) << 1; // in 16-bit words - int height = FB_R_SIZE.fb_y_size + 1; - int modulus = (FB_R_SIZE.fb_modulus - 1) << 1; - - int bpp; - switch (FB_R_CTRL.fb_depth) - { - case fbde_0555: - case fbde_565: - bpp = 2; - break; - case fbde_888: - bpp = 3; - width = (width * 2) / 3; // in pixels - modulus = (modulus * 2) / 3; // in pixels - break; - case fbde_C888: - bpp = 4; - width /= 2; // in pixels - modulus /= 2; // in pixels - break; - default: - die("Invalid framebuffer format\n"); - bpp = 4; - break; - } + PixelBuffer pb; + int width; + int height; + ReadFramebuffer(pb, width, height); if (fbTextureId == 0) fbTextureId = glcache.GenTexture(); @@ -487,98 +465,6 @@ void RenderFramebuffer() glcache.TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glcache.TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - u32 addr = SPG_CONTROL.interlace && !SPG_STATUS.fieldnum ? FB_R_SOF2 : FB_R_SOF1; - - PixelBuffer pb; - pb.init(width, height); - u8 *dst = (u8*)pb.data(); - - switch (FB_R_CTRL.fb_depth) - { - case fbde_0555: // 555 RGB - for (int y = 0; y < height; y++) - { - for (int i = 0; i < width; i++) - { - u16 src = pvr_read_area1_16(addr); - *dst++ = (((src >> 10) & 0x1F) << 3) + FB_R_CTRL.fb_concat; - *dst++ = (((src >> 5) & 0x1F) << 3) + FB_R_CTRL.fb_concat; - *dst++ = (((src >> 0) & 0x1F) << 3) + FB_R_CTRL.fb_concat; - *dst++ = 0xFF; - addr += bpp; - } - addr += modulus * bpp; - } - break; - - case fbde_565: // 565 RGB - for (int y = 0; y < height; y++) - { - for (int i = 0; i < width; i++) - { - u16 src = pvr_read_area1_16(addr); - *dst++ = (((src >> 11) & 0x1F) << 3) + FB_R_CTRL.fb_concat; - *dst++ = (((src >> 5) & 0x3F) << 2) + (FB_R_CTRL.fb_concat >> 1); - *dst++ = (((src >> 0) & 0x1F) << 3) + FB_R_CTRL.fb_concat; - *dst++ = 0xFF; - addr += bpp; - } - addr += modulus * bpp; - } - break; - case fbde_888: // 888 RGB - for (int y = 0; y < height; y++) - { - for (int i = 0; i < width; i += 4) - { - u32 src = pvr_read_area1_32(addr); - *dst++ = src >> 16; - *dst++ = src >> 8; - *dst++ = src; - *dst++ = 0xFF; - addr += 4; - if (i + 1 >= width) - break; - u32 src2 = pvr_read_area1_32(addr); - *dst++ = src2 >> 8; - *dst++ = src2; - *dst++ = src >> 24; - *dst++ = 0xFF; - addr += 4; - if (i + 2 >= width) - break; - u32 src3 = pvr_read_area1_32(addr); - *dst++ = src3; - *dst++ = src2 >> 24; - *dst++ = src2 >> 16; - *dst++ = 0xFF; - addr += 4; - if (i + 3 >= width) - break; - *dst++ = src3 >> 24; - *dst++ = src3 >> 16; - *dst++ = src3 >> 8; - *dst++ = 0xFF; - } - addr += modulus * bpp; - } - break; - case fbde_C888: // 0888 RGB - for (int y = 0; y < height; y++) - { - for (int i = 0; i < width; i++) - { - u32 src = pvr_read_area1_32(addr); - *dst++ = src >> 16; - *dst++ = src >> 8; - *dst++ = src; - *dst++ = 0xFF; - addr += bpp; - } - addr += modulus * bpp; - } - break; - } glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pb.data()); }